2017-07-17 78 views
0

我讀的書Python和HDF5(O'Reilly)的其中有他們承擔磁盤上的空數據集A部分和尺寸:尺寸上的部分填充HDF5數據集的磁盤

import numpy as np 
import h5py 

f = h5py.File("testfile.hdf5") 
dset = f.create_dataset("big dataset", (1024**3,), dtype=np.float32) 
f.flush() 
# Size on disk is 1KB 

dset[0:1024] = np.arange(1024) 
f.flush() 
# Size on disk is 4GB 

在用數據填充數據集的部分(前1024個條目)之後,我預計文件會增長,但不會達到4GB。它基本上與我的尺寸相同:

dset[...] = np.arange(1024**3) 

該書指出,磁盤上的文件大小應該在66KB左右。任何人都可以解釋突然增大的原因是什麼?

版本信息:

  • 的Python 3.6.1(OSX)
  • h5py 2.7.0

回答

2

如果您在HdfView打開你的文件,你可以看到分塊是關閉的。這意味着該數組存儲在文件的一個連續的內存塊中,無法調整大小。因此,所有4 GB必須分配在文件中。

如果您創建啓用了分塊的數據集,則數據集被分成規則大小的塊,這些塊隨意存儲在磁盤上,並使用B樹索引。在這種情況下,只有具有(至少一個數據元素)數據的塊被分配到磁盤上。如果您創建的數據集如下文件會小很多:

dset = f.create_dataset("big dataset", (1024**3,), dtype=np.float32, chunks=True) 

chunks=Trueh5py自動判斷塊的大小。您還可以顯式設置塊大小。例如,將其設置爲16384輛彩車(= 64 KB),使用方法:

dset = f.create_dataset("big dataset", (1024**3,), dtype=np.float32, chunks=(2**14,)) 

最好的塊大小取決於應用程序的讀寫模式。請注意:

分塊具有性能影響。建議將 塊的總大小保持在10 KiB和1 MiB之間,對於較大的 數據集則更大。 另請注意,當塊中的任何元素被訪問時,整個塊都從磁盤讀取。

http://docs.h5py.org/en/latest/high/dataset.html#chunked-storage