Pandas to_hdf的OverflowError

时间:2017-07-18 00:53:49

标签: python pandas hdf5 lz4

Python新手在这里。

我正在尝试使用to_hdf将大数据帧保存到HDF文件中并使用lz4压缩。

我使用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

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,似乎它确实与数据帧的大小有关,而不是与dtype有关(我将所有列存储为字符串,并且能够将它们分别存储到.h5)。

对我有用的解决方案是使用mode='a'将数据帧成块保存。 根据{{​​3}}中的建议: 模式{'a','w','r +'},默认为'a': 'a':追加,将打开一个现有文件进行读写,如果不存在该文件,则会创建该文件。

因此示例代码如下:

batch_size = 1000
for i, df_chunk in df.groupby(np.arange(df.shape[0]) // batch_size):
    df_chunk.to_hdf('df.h5','table', complib= 'blosc:lz4', mode='a')