2017-04-21 7 views
0

현재 대상을 공간적으로 스캔하고 각 개별 픽셀에서 오실로스코프 추적을 가져 오는 실험을 수행 중입니다. 일반적으로 내 추적 길이는 200Kpts입니다. 전체 대상을 스캔 한 후 공간적으로이 시간 영역 신호를 조합하여 본질적으로 스캔 한 내용의 동영상을 재생합니다. 내 스캔 영역은 크기가 330x220 픽셀이므로 전체 데이터 세트는 사용해야하는 컴퓨터의 RAM보다 큽니다.읽기/쓰기 속도에 맞게 HDF5 데이터 세트 최적화

시작하려면 각 오실로스코프 추적을 줄무늬 배열로 저장 한 다음 내 스캔이 다운 샘플링/필터링을 완료 한 후 메모리 문제가 발생하지 않는 방식으로 동영상을 연결하는 작업을 시작했습니다. 그러나 이제는 앨리어싱이 발생하고 원시 데이터에 액세스해야하므로 다운 샘플링이 불가능한 시점에 있습니다.

대형 3D 데이터 블록을 H5py를 사용하여 HDF5 데이터 세트에 저장하기 시작했습니다. 내 주요 문제는 내 청크 크기 할당입니다. 내 수신 데이터는 내가 그것을 읽어하고자하는 평면에 직교 내 데이터를 작성 (내 지식) 내 주요 옵션은 다음과 같습니다.

#Fast write Slow read 
    with h5py.File("test_h5py.hdf5","a") as f: 
     dset = f.create_dataset("uncompchunk",(height,width,dataLen),chunks = (1,1,dataLen), dtype = 'f') 
     for i in range(height): 
      for j in range(width): 
       dset[i,j,:] = np.random.random(200000) 

또는

#Slow write Fast read 
    with h5py.File("test_h5py.hdf5","a") as f: 
     dset = f.create_dataset("uncompchunk",(height,width,dataLen),chunks = (height,width,1), dtype = 'f') 
     for i in range(height): 
      for j in range(width): 
       dset[i,j,:] = np.random.random(200000)  

가 있는가 어떤 경우에도 두 경우를 최적화 할 수 없으므로 둘 다 실행하기가 비효율적입니까?

+0

당신이 사전에 데이터 세트의 크기를 알고, 압축을 사용하지 않으려면 , 연속 된 저장소 (즉, 청크 없음)를 사용할 수 있습니다. 그걸 시도해 볼 수 없니? – titusjan

답변

0

코드에 성능상의 함정이 있습니다.

    당신은
  1. 가 적절한 청크 캐시 크기를 설정/읽기 HDF5 데이터 세트에 기록 할 때 어두워집니다. 배열의 수를 변경하지 마십시오 (라인에 화려한 색인의 일종을 사용하는

  2. , 당신이 읽거나 전체 덩어리를 작성하지 않는 경우. https://stackoverflow.com/a/42966070/4045774

  3. 는 HDF5- API를 읽거나 쓸 통화의 양을 줄일 수 있습니다.

  4. 는 appropiate 청크 크기를 선택합니다 (덩어리는 완전히 읽기/쓰기 할 수 있습니다, 그래서 한 부분 만 필요하면 나머지는 캐시에 남아 있어야 함)

다음 예는 HDF5-API에 의한 캐싱을 사용합니다. 적절한 캐시 크기를 설정하기 위해 h5py_cache를 사용할 것입니다. https://pypi.python.org/pypi/h5py-cache/1.0.1

캐싱을 수행하면 성능을 더욱 향상시킬 수 있습니다.

쓰기 읽기

# minimal chache size for reasonable performance would be 20*20*dataLen*4= 320 MB, lets take a bit more 
with h5py_cache.File(h5pyfile, 'r+',chunk_cache_mem_size=500*1024**2) as f: 
    dset = f.create_dataset("uncompchunk",(height,width,dataLen),chunks = (20,20,20), dtype = 'f') 
    for i in range(height): 
     for j in range(width): 
      # avoid fancy slicing 
      dset[i:i+1,j:j+1,:] = expand_dims(expand_dims(np.random.random(200000),axis=0),axis=0) 

(읽기 및 전체 덩어리 쓰기)

# minimal chache size for reasonable performance would be height*width*500*4= 145 MB, lets take a bit more 
with h5py_cache.File(h5pyfile, 'r+',chunk_cache_mem_size=200*1024**2) as f: 
    dset=f["uncompchunk"] 
    for i in xrange(0,dataLen): 
     Image=np.squeeze(dset[:,:,i:i+1])