假设我们使用pandas.HDFStore
存储df。并使其存储格式为table
。因此,我们可以query个子帧,进行一些争执,将append个更多的数据放入df中(假设我们正在处理流数据),等等。
但是,一旦我们完成了数据处理(例如,在流传输的情况下-例如,我们已经处理了过去一年中的所有数据),我们可能希望此数据变得“稳定”,即不再需要查询/追加(我们已经完成了) )。同时,我们可能想从df
中读回完整的HDFStore
以可视化处理后的结果。在这种情况下,最好使用fixed
格式。因为它在磁盘上的位置较少,所以读取整体的速度更快。
这件事-有办法执行从磁盘table
到fixed
的 on_disk 更改存储数据帧的格式(也许删除所有“索引”或类似的操作) )?
为什么要在磁盘上?当然是因为RAM。在追加期间,我们的df
可能会变得很大,因此我们的RAM仅足以读取df并进行一些简单的绘图或计算一些统计信息,而我们甚至无法负担df
从商店以table
格式:
size_mult = 7
df = pd.DataFrame(np.random.rand(10**size_mult, 10),
columns = list('abcdefghik'))
print('df size is %d MiB' % (df.memory_usage().sum()//1024**2))
with pd.HDFStore('test.h5') as store:
%memit store.put('df', df, 't', data_columns=['a','b','c'])
%memit store.select('df')
store.remove('df')
del df
_ = gc.collect()
占用大量内存:
df size is 762 MiB
peak memory: 2375.16 MiB, increment: 1335.83 MiB
peak memory: 4217.48 MiB, increment: 3088.03 MiB
我认为这里值得花点时间拥抱“有趣的”音符-df大小为760 MiB的人需要4200 MiB(即大约 6倍 比初始df大小大),以便在格式为HDFStore
并且指定了3个数据列的情况下从table
读取数据帧。
但是,如果设法以某种方式将磁盘上的格式更改为fixed
,这种情况就可以接受了:
size_mult = 7
df = pd.DataFrame(np.random.rand(10**size_mult, 10),
columns = list('abcdefghik'))
print('df size is %d MiB' % (df.memory_usage().sum()//1024**2))
with pd.HDFStore('test.h5') as store:
%memit store.put('df', df, 'f')
%memit store.select('df')
store.remove('df')
del df
_ = gc.collect()
df size is 762 MiB
peak memory: 1001.88 MiB, increment: 76.30 MiB
peak memory: 1745.78 MiB, increment: 743.89 MiB