hdf5文件增长巨大,同时只附加

2024-09-29 17:13:45 发布

您现在位置:Python中文网/ 问答频道 /正文

使用HDFSM数据存储在HDFSI文件中。在

通常情况下,数据一次只附加一个样本,而不是长批次。在

我注意到文件增长得相当快,我可以通过ptrepack大大减少它们。在

下面是一个小文件的例子。我的应用程序(使用zlib和complevel9)生成的文件有6.7mb大。在

/ (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}

如果我不带选项重新打包,它会变得更小(71K):

^{pr2}$

当使用--complevel=1--complevel=9时,我得到一个19K文件。在

^{3}$

这些文件都很小,但我想说的是,只要重新打包,我就可以将整个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数据。


Tags: 文件数据postest应用程序index情况样本

热门问题