使用熊猫read_hdf读取hdf文件的块时间太长

时间:2019-01-29 17:32:18

标签: pandas hdf5 pytables chunks

我们有一个问题,我们需要在磁盘上存储约10列的混合数据(浮点/整数)临时数据帧,然后再读取并处理它。

真实情况的数据帧约为3亿行,这将产生10GB以上的压缩hdf文件-因此我们无法负担读取内存中的全部内容,而必须逐块处理它。

根据我们的经验-使用pandas写入hdf很快:

chunks = map(job, range(num_chunks))
append = False
for chunk in chunks:
chunk.to_hdf(output,
             key='results',
             format='table',
             complevel=9,
             complib="blosc:snappy",
             append=append)
append = True

其中job是产生数据帧大块的函数。在实际情况下,我们使用multiprocessing生成块,但这与问题无关...

但是,阅读时间太长-甚至看起来都不足够-我确信我在这里做错了事:

res = pd.read_hdf(output,key='results',iterator=True,chunksize=chunksize_read)
## Do some silly computation on each chunk here
## real-life processing is going to be some histogramming
compute_res = [ _['a'].mean() for _ in res ]

一些现实世界的时间-大约2分钟生成大约10GB的HDF和大约40+分钟(!!!)以读取生成的文件...

问题似乎与数据帧中的混合数据类型无关……我创建了一个超最小的example,在这里我可以使用只有1个浮点数的数据帧来重现相同的问题(! )。

以下是使用最小示例的一些时间安排:

time took to write 50000000 elements  in 100 chunks to xxx.h5: 15.09 sec
time took to read 50000000 elements  in chunks of 100 and to do a mock  computation per chunk: 322.29 sec
time took to read 50000000 elements in RAM at once and to do a mock  computation: 0.87 sec

感谢您的帮助! 谢谢!

PS

我们甚至不必为此使用hdf ...但是我们真的很想将其保留在pandas API中-即dataframe_chunk.to_whatever(fname,some_nice_compression=True)在一侧,{{ 1}}。

0 个答案:

没有答案