hdf5文件越来越大,只附加

时间:2018-06-04 09:05:34

标签: python pandas hdf5 pytables hdfstore

我使用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。

0 个答案:

没有答案