Pandas to_hdf的OverflowError

问题描述 投票:5回答:1

这里是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
python pandas hdf5 lz4
1个回答
0
投票

我经历了同样的问题,似乎确实与数据帧的大小有关,而不是与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
© www.soinside.com 2019 - 2024. All rights reserved.