2016-08-22 2 views
1

h5py 데이터 세트에 데이터를 쓰려고하지만, 12MB GCE 인스턴스를 사용하여 SSD 디스크에 쓰기는하지만 실행합니다 시야에 끝이없는 13 시간 동안. 는 내가 SSD 디스크에 저장된 파일에 h5py 데이터 세트에 추가하기 전에 (제 2의 비 SSD 디스크에 저장) 작은 파일의 큰 숫자를 unpickle하는 GCE 인스턴스에서 Jupyter 노트북을 실행하는거야SSD 디스크의 h5py에 데이터 쓰기가 느리게 나타남 : 속도를 높이려면 어떻게해야합니까?

  • 최대 형상 = (29914, 251328)
  • 덩어리 = (59, 982)
  • 압축 = gzip
  • DTYPE = float64

내 코드는 디스크의 h5py 파일은 제가 위에서 아래 코드를 사용하여 웁니다있는 각 데이터 세트를 1.4GB를 높일 것으로 보인다

#Get a sample 
minsample = 13300 
sampleWithOutReplacement = random.sample(ListOfPickles,minsample) 

print(h5pyfile) 
with h5py.File(h5pyfile, 'r+') as hf: 
    GroupToStore = hf.get('group') 
    DatasetToStore = GroupToStore.get('ds1') 
    #Unpickle the contents and add in th h5py file     
    for idx,files in enumerate(sampleWithOutReplacement): 
     #Sample the minimum number of examples 
     time FilePath = os.path.join(SourceOfPickles,files) 
     #Use this method to auto close the file 
     with open(FilePath,"rb") as f: 
      %time DatasetToStore[idx:] = pickle.load(f) 
      #print("Processing file ",idx) 

print("File Closed") 

아래에 나열된 것은 h5py 파일

group.create_dataset(labels, dtype='float64',shape= (maxSize, 251328),maxshape=(maxSize,251328),compression="gzip") 

의 데이터 세트를 생성하려면 코드입니다 h5py 파일을 채우는 데 필요한 시간을 줄이기 위해 구성이나 코드 또는 둘 모두를 개선 할 수 있습니까?

업데이트 1 은 내가 8hrs

CPU times: user 0 ns, sys: 0 ns, total: 0 ns 
Wall time: 14.1 µs 
CPU times: user 8h 4min 11s, sys: 1min 18s, total: 8h 5min 30s 
Wall time: 8h 5min 29s  

답변

1
을 복용으로보고 된 데이터 저장소에로드를 가속화에 어떤 조언을 환영 것, 시간 과정을 jupyter 노트북에 약간의 마법을 추가

이것은 매우 잘못된 것 같다 DatasetToStore [IDX :]

당신은 아마 원하는 : DatasetToStore [IDX, ...]

나는 생각한다 귀하의 버전은 idx 이후의 모든 행을 반복 할 때마다 unpickled 데이터 세트로 덮어 씁니다. 이 버전은 각 반복에서 데이터 세트에 단일 행을 덮어 씁니다.

1
  1. JRoose가 맞습니다. 코드가 잘못된 것 같습니다.

  2. 기본적으로 h5py는 1MB의 청크 캐시 만 사용하므로 문제가 충분하지 않습니다. 저수준 API에서 캐시 설정을 변경하거나 h5py_cache를 대신 사용할 수 있습니다.

    with h5py_cache.File(h5pyfile, 'r+',chunk_cache_mem_size=500*1024**2) as hf 
    

    https://pypi.python.org/pypi/h5py-cache/1.0

    변경 라인

    with h5py.File(h5pyfile, 'r+') as hf 
    

    는 5백메가바이트에 예를 들어, 청크 캐시를 증가시킵니다.

  3. 나는 1D 배열에서 pickle.load(f) 결과를 추측합니다. 귀하의 데이터 세트는 2D입니다.당신이

    %time DatasetToStore[idx,:] = pickle.load(f) 
    

    쓰기하지만 내 연구 결과에 오히려 느린 될 때이 경우 는 아무 잘못이 없습니다. 속도를 높이려면 데이터를 데이터 집합에 전달하기 전에 2D 배열을 만듭니다.

    %time DatasetToStore[idx:idx+1,:] = np.expand_dims(pickle.load(f), axis=0) 
    

    왜 이렇게 빠른 지 알 수 없지만 내 스크립트에서이 버전은 위의 버전보다 약 20 배 빠릅니다. HDF5 파일에서 읽는 경우에도 마찬가지입니다.

관련 문제