我们有一个问题,我们需要在磁盘上存储约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}}。