Pandas HDFStore更改存储数据帧的格式

时间:2019-06-13 23:44:09

标签: python pandas performance dataframe

假设我们使用pandas.HDFStore存储df。并使其存储格式为table。因此,我们可以query个子帧,进行一些争执,将append个更多的数据放入df中(假设我们正在处理流数据),等等。

但是,一旦我们完成了数据处理(例如,在流传输的情况下-例如,我们已经处理了过去一年中的所有数据),我们可能希望此数据变得“稳定”,即不再需要查询/追加(我们已经完成了) )。同时,我们可能想从df中读回完整的HDFStore以可视化处理后的结果。在这种情况下,最好使用fixed格式。因为它在磁盘上的位置较少,所以读取整体的速度更快。

这件事-有办法执行从磁盘tablefixed 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

0 个答案:

没有答案