我使用pandas HDFStore将数据存储在hfd5文件中。
通常,数据一次附加一个样本,而不是长批量。
我注意到文件增长得非常快,我可以用ptrepack大幅减少它们。
这是一个小文件的示例。我的应用程序生成的文件(使用zlib和complevel 9)大6.7 MB。
/ (RootGroup) ''
/test (Group) ''
/test/table (Table(1042,), shuffle, zlib(1)) ''
description := {
"index": Int64Col(shape=(), dflt=0, pos=0),
"values_block_0": Float64Col(shape=(2,), dflt=0.0, pos=1),
"values_block_1": Int64Col(shape=(1,), dflt=0, pos=2)}
byteorder := 'little'
chunkshape := (2048,)
autoindex := True
colindexes := {
"index": Index(6, medium, shuffle, zlib(1)).is_csi=False}
如果我没有选项ptrepack它,它会变得非常小(71K):
/ (RootGroup) ''
/test (Group) ''
/test/table (Table(1042,)) ''
description := {
"index": Int64Col(shape=(), dflt=0, pos=0),
"values_block_0": Float64Col(shape=(2,), dflt=0.0, pos=1),
"values_block_1": Int64Col(shape=(1,), dflt=0, pos=2)}
byteorder := 'little'
chunkshape := (2048,)
使用--complevel=1
或--complevel=9
时,我会收到19K文件。
/ (RootGroup) ''
/test (Group) ''
/test/table (Table(1042,), shuffle, zlib(1)) ''
description := {
"index": Int64Col(shape=(), dflt=0, pos=0),
"values_block_0": Float64Col(shape=(2,), dflt=0.0, pos=1),
"values_block_1": Int64Col(shape=(1,), dflt=0, pos=2)}
byteorder := 'little'
chunkshape := (2048,)
/ (RootGroup) ''
/test (Group) ''
/test/table (Table(1042,), shuffle, zlib(9)) ''
description := {
"index": Int64Col(shape=(), dflt=0, pos=0),
"values_block_0": Float64Col(shape=(2,), dflt=0.0, pos=1),
"values_block_1": Int64Col(shape=(1,), dflt=0, pos=2)}
byteorder := 'little'
chunkshape := (2048,)
这些是小文件,但我的观点是,我可以通过重新打包将整个35GB数据库缩小到几百MB。
写作方式一定有问题。
我知道"hdf5 does not reclaim space" warning。正常用例不涉及删除数据,也可能只是轻微删除数据。
要附加新数据,我使用
store.append(data_id, data_dataframe)
所以我只是追加。我不会删除/写入整个数据。
我发现上面的转储存在差异
autoindex := True
colindexes := {
"index": Index(6, medium, shuffle, zlib(1)).is_csi=False}
但我不知道该怎么做。
我怀疑尺寸问题可能是因为样品一次添加一个。但我不明白为什么这应该是一个问题。即使添加少量数据,也应该压缩整个块。
或者是因为每次修改一个块时,它都写在另一个空间上并且旧的块空间丢失了?
在这种情况下,我猜我的选择是:
修改应用程序,以便批量写入数据。也许通过添加缓存层。几乎不可能。我不妨更改基础数据库。
选择低得多的块大小。但这也有缺点。
设置脚本以定期对数据进行ptrepack。