RAM (~ 100G)에 비해 너무 큰 numpy 배열의 평균을 계산할 때 문제가 있습니다.hdf5 파일에서 memmapped 한 큰 숫자 배열의 평균을 계산하십시오.
나는 np.memmap
를 사용을 검토 한 결과,하지만 불행히도 내 배열은 HDF5 파일에 데이터 세트로 저장됩니다. 그리고 내가 시도한 것을 기반으로, np.memmap은 hdf5 데이터 세트를 입력으로 받아들이지 않습니다.
TypeError: coercing to Unicode: need string or buffer, Dataset found
np.mean
을 효율적으로 디스크에서 메모리 매핑 된 배열에 호출하려면 어떻게해야합니까? 물론 각 부분이 메모리에 들어 맞는 부분의 데이터 세트를 반복 할 수 있습니다.
그러나이 방법은 해결 방법과 너무 흡사하며 최상의 성능을 얻을 수 있는지 확실하지 않습니다.
는 여기에 몇 가지 예제 코드입니다 :
data = np.randint(0, 255, 100000*10*10*10, dtype=np.uint8)
data.reshape((100000,10,10,10)) # typically lot larger, ~100G
hdf5_file = h5py.File('data.h5', 'w')
hdf5_file.create_dataset('x', data=data, dtype='uint8')
def get_mean_image(filepath):
"""
Returns the mean_array of a dataset.
"""
f = h5py.File(filepath, "r")
xs_mean = np.mean(f['x'], axis=0) # memory error with large enough array
return xs_mean
xs_mean = get_mean_image('./data.h5')
내가이가'h5py' 데이터 세트의 읽기 청크 분할 할 앞서 갈 것. 그 일을하십시오. 그런 다음 반복을 통해 실제로 시간이 소요되는지 테스트 할 수 있습니다. 대규모 배열의 경우 메모리 관리 비용이 반복 비용보다 클 수 있습니다. – hpaulj
네 말이 맞아, 실제로 그렇게 많은 비용이 들지는 않아. 유일한 단점은 코딩해야하는 루프이므로 너무 우아하지 않습니다. 고맙습니다! – 0vbb