2017-04-21 78 views
0

我目前正在運行一個實驗,其中我在空間上掃描目標並在每個離散像素處抓取示波器跡線。通常我的走線長度是200Kpts。在掃描整個目標後,我將這些時域信號在空間上組裝起來,並基本播放所掃描的電影。我的掃描區域大小爲330x220像素,因此整個數據集大於我必須使用的計算機上的RAM。爲讀/寫速度優化HDF5數據集

首先,我只是將每個示波器軌跡保存爲一個numpy數組,然後在我的掃描完成了下采樣/濾波等後,再以一種不會遇到內存問題的方式拼接電影。但是,現在我正處於一個不能縮減採樣的點,因爲會發生混疊,因此需要訪問原始數據。

我已經開始考慮使用H5py將我的大型3D數據塊存儲在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. 選擇一個適當的塊大小(塊只能讀/寫的完全,所以如果你只需要一部分的話大塊其餘的應該留在緩存中)

以下示例使用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])