这里是Python新手。
我正在尝试使用to_hdf通过lz4压缩将大数据帧保存到HDF文件中。
我使用Windows 10,Python 3,Pandas 20.2
我收到错误“ OverflowError:Python int太大,无法转换为C long”。
没有机器资源都接近其极限(RAM,CPU,SWAP使用率)
以前的文章讨论了dtype,但是下面的示例显示还有其他问题,可能与大小有关?
import numpy as np
import pandas as pd
# sample dataframe to be saved, pardon my French
n=500*1000*1000
df= pd.DataFrame({'col1':[999999999999999999]*n,
'col2':['aaaaaaaaaaaaaaaaa']*n,
'col3':[999999999999999999]*n,
'col4':['aaaaaaaaaaaaaaaaa']*n,
'col5':[999999999999999999]*n,
'col6':['aaaaaaaaaaaaaaaaa']*n})
# works fine
lim=200*1000*1000
df[:lim].to_hdf('df.h5','table', complib= 'blosc:lz4', mode='w')
# works fine
lim=300*1000*1000
df[:lim].to_hdf('df.h5','table', complib= 'blosc:lz4', mode='w')
# Error
lim=400*1000*1000
df[:lim].to_hdf('df.h5','table', complib= 'blosc:lz4', mode='w')
....
OverflowError: Python int too large to convert to C long
我经历了同样的问题,似乎确实与数据帧的大小有关,而不是与dtype有关(我将所有列存储为字符串,并且能够将它们分别存储到.h5)。
对我有用的解决方案是使用mode='a'
将数据帧保存为块。如pandas documentation中的建议:mode {'a','w','r +'},默认为'a': 'a':附加,将打开一个现有文件以供读取和写入,如果文件不存在,则会创建它。
因此,示例代码将类似于:
lower_lim = 0
higher_lim = 100*1000*1000
for i in range(0,(int(round(len(df)/(100*1000*1000),0))+1)):
df[lower_lim:higher_lim].to_hdf('df.h5','table', complib= 'blosc:lz4', mode='a')
lower_lim += 100*1000*1000
higher_lim += 100*1000*1000