Memory Error 처리 방법

10825 단어
프로젝트를 할 때 40442장의 그림을 불러와야 하는데 메모리 오류가 발생했습니다: MemoryError: Unable to allocate 4.34 GiB for an array with shape (40442, 80, 60, 3) and data type float64.오류 소스 코드:
data = np.array(data, dtype="float") / 255.0#  float64

몇 가지 발견된 해결 전략을 기록하다.

1. 저밀도 데이터 저장


  는 일반적으로 numpy를 통해 얻은 16자리 부동점수를 계산한다.float64가 차지하는 메모리는 float32의 2배이고 float16의 4배이다. 예를 들어 CIFAR10 데이터 세트에 대해 float64로 표시하면 60000이 필요하다. 32개 8/1024개 데이터 세트의 경우 1.4G 60000*32**3****3*****3=1.4G 60000 8/8/8/1024 = 1.4G 60000***3******************3=1.4G 60000 32\3272727272727272727272727272 32\3287327272727272727272727272 3?=1010108==108\272727데이터 세트를 메모리로 가져오려면 1.4G가 필요합니다.플로트32를 적용하면 0.7G, 플로트16을 적용하면 0.35G 정도면 된다.메모리를 얼마나 많이 차지하는지는 시스템 운영 효율에 심각한 영향을 미치기 때문에 데이터 집합 파일은 모두 uint8로 데이터가 존재하고 파일을 최소화한다.

2. 업데이트 python은 64비트, 업데이트 Pandas/Numpy 라이브러리는 64비트


\Python 32bit 최대 2G 메모리만 사용할 수 있습니다.32비트의 파이톤이 설치한pandas와Numpy도 32비트에 불과하다. 그러면 메모리가 2G를 초과하면 자동으로 메모리를 종료하고 64bit python은 이 제한이 없다.
  • 파이썬 비트 보기: 셸에 python를 입력하십시오.

  • 3. pycharm의 실행 메모리 수정


    메모리 사용률이 높지 않지만 MemoryError가 나타나면 메모리 제한이 있을 수 있습니다.
  • Help →\rightarrow →Find Action →\rightarrow →(type “VM Options”) →\rightarrow →(Click)“Edit Custom VM Options”;
  • pycharm64를 엽니다.exe.vmoptions 편집하기;
  • 수정-Xmx750m-Xmx4096m에 4G 메모리를 분배하고 상황에 따라 정한다.
  • pycharm을 저장하고 다시 시작합니다.

  • 4. 가상 메모리 확장


    구체적인 설정:
  • 내 컴퓨터를 우클릭하고 "속성;
  • 을 선택한다.
  • 열린 패널에서 고급 시스템 설정 - 고급 탭 - 성능 설정 - 고급 탭 - 변경, 가상 메모리 설정 인터페이스로 이동합니다.
  • 모든 드라이브의 페이지 파일 크기를 자동으로 관리하기 위한 옵션 앞 상자의 표시를 취소하고 문자(가능한 한 시스템 디스크가 아님)를 선택하고 사용자 정의 크기를 선택하고 초기 크기와 최대값을 가능한 한 같은 수치로 설정합니다(컴퓨터의 물리적 메모리 설정, 예를 들어 컴퓨터의 물리적 메모리가 2GB이면 3GB에서 6GB 사이에 수치를 선택할 수 있음). 그리고 설정을 클릭하면마지막으로 확인을 누르고 컴퓨터를 다시 시작합니다.

  • 물리적 및 가상 메모리: 물리적 메모리
  • 물리적 메모리는 진실하게 존재하는데 그 표현 형식은 컴퓨터 메인보드에 꽂힌 메모리 게이지이고 기계의 설정을 볼 때 물리적 메모리를 본다.
  • 메모리 게이지의 읽기와 쓰기 속도가 2700MB/s 이상입니다.
  • 물리적 메모리 용량은 메모리 게이지에 의해 결정되며 메모리 게이지가 몇 GB이고 물리적 메모리가 몇 GB인지 결정됩니다.
  • 물리적 메모리는 CPU와 통신하는 다리입니다.

  • 가상 메모리
  • 가상 메모리는 가상으로 존재하지만 사실은 컴퓨터가 일부 하드디스크 공간을 균등하게 나누어 메모리로 사용한다.메모리가 다 소모되면 컴퓨터는 자동으로 하드디스크를 메모리로 호출하여 메모리의 긴장을 완화시킨다.
  • 일반 기계 하드디스크의 읽기와 쓰기 속도는 150MB/s에 불과하고 고체 하드디스크라도 500MB/s에 달하기 때문에 물리 메모리에 비해 가상 메모리의 읽기와 쓰기 속도가 매우 느리다.
  • 가상 메모리의 용량 크기는 설정을 통해 변경할 수 있다.
  • 가상 메모리는 컴퓨터가 프로그램을 실행하거나 조작하는 데 필요한 물리적 메모리가 부족할 때 보상 역할을 한다.

  •  당신의 메모리가 이미'구제불능'일 정도로 크다고 해도 가상 메모리를 닫아서는 안 된다. 전통적인 RAM'백업'이라는 기능을 제외하고 윈도도 가상 메모리를 이용하여 특정한 조작을 수행하기 때문이다.이 밖에 가상 메모리의 열기는 메모리 명중률을 높이고 시스템의 안정성을 확보하는 데 도움이 되며 개별 소프트웨어(예를 들어 포토샵, 3Dmark 등)도 실행할 때 가상 메모리가 필요하다.
    컴퓨터, 가상 메모리, 물리 메모리, 어떤 차이가 있습니까?어느 것이 더 좋아요.|메모리 관리 소개

    5. 데이터 읽기 최적화


    TensorFlow가 데이터를 읽는 방법에 대해 홈페이지는 세 가지 방법을 제시했다.
  • 공급 데이터:TensorFlow 프로그램에서 실행되는 모든 단계에서 Python 코드로 데이터를 공급합니다.
  • 파일에서 데이터 읽기: TensorFlow 그림에서 시작하여 입력 파이프라인을 만들어 파일에서 데이터를 읽습니다.
  • 데이터 미리 불러오기: TensorFlow 그림에서 상수나 변수를 정의하여 모든 데이터를 저장합니다(데이터 양이 비교적 적은 경우에만 적용).

  •   사용자가 입력 데이터를 처리하는 전형적인 절차는 먼저 입력 데이터 집합을 파일 시스템 종류에서 메모리로 읽은 다음에 모델에 필요한 입력 데이터 형식으로 전환한 다음에 어떤 방식으로 데이터 흐름도를 전송하고 진정한 모델 훈련 과정을 시작하는 것이다.입력 데이터 세트는 일반적으로 파일 시스템 유형과 입력 데이터 세트 크기에 따라 두 가지 데이터 읽기 방법이 있습니다.
  • 빅데이터 집합: (예를 들어 ImageNet) 일반적으로 대량의 데이터 파일로 구성되어 있는데 데이터 규모가 너무 커서 메모리에 한꺼번에 모두 불러올 수 없다. 메모리가 너무 소모되기 때문에 이때TensorFlow가 제공하는 대기열queue, 즉 두 번째 방법으로 파일에서 데이터를 읽는 것이 가장 좋다.빅데이터 세트는 TFRecords 형식을 많이 사용합니다.
  • 작은 데이터 집합: (예를 들어 MNIST) 파일 하나만 포함될 수 있기 때문에 사용자는 모델 트레이닝을 시작하기 전에 메모리 처리에 한꺼번에 불러온 다음batch 입력 네트워크로 나누어 트레이닝을 할 수 있다. 즉, 세 번째 방법으로 데이터를 미리 불러올 수 있다.작은 데이터 집합을 사용할 때 미니버치를 많이 사용합니다.

  • 희소 데이터의 저장


     데이터가 희소한 상황에서 만약에 훈련이 대량의 원 hot 특징을 집중한다면 이때dense의 데이터를sparse로 저장하는 방식은 메모리의 점용을 줄일 수 있다. scipy의sparse 모듈을 참고하면 안에sparse 저장을 지원하는 여러 가지 데이터 구조가 있어 직접 호출할 수 있다.그러나 이 모듈의 집중 데이터 구조는 적어도dense 데이터의 2-3배의 공간을 저장해야 한다. 즉, 만약에 수조에서sparse의 절반, 심지어 더 적으면sparse구조를 사용하면 더 많은 공간을 차지하고 데이터에서 대량으로 희소한 상황에서만 사용할 수 있다.
    python 처리 대훈련 집합 과정 중 만났던 Memory Error 문제 해결

    pandas에서 read 사용csv 블록 읽기

  • 블록 읽기: 모든 데이터를 한 번에 메모리에 넣지 않고 블록을 나누어 메모리에 읽은 다음에 블록을 합쳐서 완전한 DataFrame을 형성한다.
  • with open(path) as f:
    	data = pd.read_csv(path, sep=',',engine = 'python',iterator=True)
    	loop = True
    	index,chunkSize,chunks = 0,1000,[]
    	while loop:
        	try:
            	print(index)
            	chunk = data.get_chunk(chunkSize)
            	chunks.append(chunk)
            	index+=1
    		except StopIteration:
            	loop = False
            	print("Iteration is stopped.")
    print(' ')
    data = pd.concat(chunks, ignore_index= True)
    

    read()/readline()/readlines()

  • read(): 파일의 모든 내용을 한꺼번에 읽을 수 있으며 파일이 작으면 한꺼번에 읽는 것이 가장 편리하다.
  • read(size): 매번 최대 크기의 내용을 읽을 때마다 파일 크기를 확정하지 못하면read(size)를 반복해서 호출하여 비교적 안전하다.
  • readline(): 매번 한 줄의 내용을 읽는다.
  • readlines(): 모든 내용을 한 번에 읽고 줄로list를 되돌려줍니다. 프로필이면readlines ()를 호출하는 것이 가장 편리합니다.
  • 큰 파일을 처리하는 것은 쉽게 생각할 수 있는 것이다. 큰 파일을 약간의 작은 파일로 나누어 처리하고, 모든 작은 파일을 처리한 후에 이 부분의 메모리를 방출하는 것이다.
    def read_in_chunks(filePath, chunk_size=1024*1024):
        """
        Lazy function (generator) to read a file piece by piece.
        Default chunk size: 1M
        You can set your own chunk size 
        """
        with open(filePath) as file_object:
        	while True:
            	chunk_data = file_object.read(chunk_size)
            	if not chunk_data:
                	break
            	yield chunk_data
    if __name__ == "__main__":
        filePath = './path/filename'
        for chunk in read_in_chunks(filePath):
            process(chunk) # 
    

    HDF5 파일


    일괄 읽기/쓰기 HDF5 파일:Python 처리 HDF5 파일:h5py 라이브러리

    TFRecords 형식


    TFRecords 형식과 h5py 형식은 유사한 효용이다.
    TensorFlow 학습노트의 30분 동안 TFRecords 포맷으로 데이터를 효율적으로 처리하는 tensorflow TFRecords 파일의 생성과 읽기 방법을 배웁니다

    6. 수동 회수 변수(Python)


      Python의 쓰레기 회수 메커니즘은 비교적 게으르다. 때로는 하나의 for 순환 중의 변수를 다 써도 회수하지 않고 다음에 다시 초기화할 때 공간을 다시 개척한다. 이때 수동으로델이라는 변수를 del x하고 import gc한 다음에 수동으로gc.collect()할 수 있다.
    Python 학습:numpy 라이브러리 데이터 양이 너무 많아 Memory Error 문제 해결 방법 요약win10 pycharm 출현 Memory Error와 Unable to allocate array with shape

    좋은 웹페이지 즐겨찾기