2017-07-17 49 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