在h5py文件中替换组会使大小持续增长



我有一些数据帧,我需要存储在HDF5文件中,无论是单独的还是串联的。我试图使用组来保存单个数据帧。数据帧保存使用:

df1.to_hdf(filename, key="S1", mode="a", complevel=9)
df2.to_hdf(filename, key="S2", mode="a", complevel=9)
...

,然后将连接的数据帧保存为:

df_concatenated = pd.concat([df1, df2])
df_concatenated.to_hdf(filename, key="key", mode="a", complevel=9)

功能工作,重新加载数据帧确认单独和连接的数据帧都被正确保存。但是,每次我运行to_hdf时,文件大小都在增长。但是,每次写入后,文件中的键保持不变:

import h5py
f = h5py.File(filename, mode='r')
f.keys()

显示["S1", "S2", "key"]符合预期。

我认为这个问题是由一些悬空数据引起的,所以我添加了代码来删除以前存在的数据,如果适用的话:

try:
with h5py.File(filename, mode='a') as f:
del f[key]
except (KeyError, TypeError, FileNotFoundError):
pass

但是文件的大小一直在增长,每次我覆盖文件的一部分(一个键和复合键),文件的大小几乎都会翻倍。

如何保持相同数据的文件大小不变?也就是说,如果我使用to_hdf覆盖具有相同数据帧的数据,我如何确保文件大小保持不变?

感谢@kcw78的解释和可能的解决方案。我无法控制这些代码可能运行的环境,因此我无法可靠地调用实用程序。

这是我现在使用的解决方案。虽然不理想,但很有效。

with h5py.File(filename, mode='r') as f:
all_keys = list(f.keys())
...
df_dict = {}
for k in all_keys:
if k != "key":
df_dict[k] = pd.read_hdf(filename, key=k)
...
# Overwrite file here
df_concatenated.to_hdf(filename, key="key", mode="w", complevel=9)
...
for k, v in df_dict.items():
v.to_hdf(filename, key=k, mode="a", complevel=9)

基本上我只是加载所有的数据帧在内存中,当写合并的数据帧回来,我使用mode="w"。这将覆盖以前的文件,导致自动"重新打包"。然后我写回其他键。

在我的情况下,数据帧不是太大,所以一次性加载内存中的所有数据帧是可行的。生成的文件大小现在正好是它应该有的大小。

最新更新