Python Pandas to_pickle 无法 pickle 大数据帧
Python Pandas to_pickle cannot pickle large dataframes
我有一个包含 500,000 行的数据框 "DF"。以下是每列的数据类型:
ID int64
time datetime64[ns]
data object
"data" 列中的每个条目都是一个大小为 [5,500]
的数组
当我尝试使用
保存此数据框时
DF.to_pickle("my_filename.pkl")
它返回了以下错误:
12 """
13 with open(path, 'wb') as f:
---> 14 pkl.dump(obj, f, protocol=pkl.HIGHEST_PROTOCOL)
OSError: [Errno 22] Invalid argument
我也试过这个方法,但我得到了同样的错误:
import pickle
with open('my_filename.pkl', 'wb') as f:
pickle.dump(DF, f)
我尝试保存此数据框的 10 行:
DF.head(10).to_pickle('test_save.pkl')
而且我完全没有错误。因此,它可以节省小DF但不能节省大DF。
我在 Mac.python 3 中使用 ipython notebook 3。
请帮我解决这个问题。我真的需要将这个 DF 保存到 pickle 文件中。我在网上找不到解决方法。
可能不是你想要的答案,但这就是我所做的......
使用 np.array_split 将数据帧拆分为更小的块(虽然不能保证 numpy 函数可以工作,但现在可以,尽管它曾经有一个错误)。
然后 pickle 较小的数据帧。
当你解开它们时,使用 pandas.append 或 pandas.concat 将所有东西粘在一起。
我同意这是一种捏造和次优的做法。如果有人可以提出 "proper" 答案,我很想看看它,但我认为它就像数据帧一样简单,不应该超过一定的大小。
Split a large pandas dataframe
直到 pickle/pandas 方面的某处得到修复,
我会说更好的选择是使用替代 IO 后端。 HDF 适用于大型数据集 (GB)。所以你不需要添加额外的 split/combine 逻辑。
df.to_hdf('my_filename.hdf','mydata',mode='w')
df = pd.read_hdf('my_filename.hdf','mydata')
尝试使用压缩。它对我有用。
data_df.to_pickle('data_df.pickle.gzde', compression='gzip')
我 运行 遇到了同样的问题,并将原因追溯到内存问题。根据 this recourse 这通常不是由内存本身引起的,而是将太多资源移动到交换 space 中。我能够通过禁用与命令(在 link 中提供)一起禁用交换来保存大 pandas 文件:
swapoff -a
我有一个包含 500,000 行的数据框 "DF"。以下是每列的数据类型:
ID int64
time datetime64[ns]
data object
"data" 列中的每个条目都是一个大小为 [5,500]
的数组当我尝试使用
保存此数据框时DF.to_pickle("my_filename.pkl")
它返回了以下错误:
12 """
13 with open(path, 'wb') as f:
---> 14 pkl.dump(obj, f, protocol=pkl.HIGHEST_PROTOCOL)
OSError: [Errno 22] Invalid argument
我也试过这个方法,但我得到了同样的错误:
import pickle
with open('my_filename.pkl', 'wb') as f:
pickle.dump(DF, f)
我尝试保存此数据框的 10 行:
DF.head(10).to_pickle('test_save.pkl')
而且我完全没有错误。因此,它可以节省小DF但不能节省大DF。
我在 Mac.python 3 中使用 ipython notebook 3。
请帮我解决这个问题。我真的需要将这个 DF 保存到 pickle 文件中。我在网上找不到解决方法。
可能不是你想要的答案,但这就是我所做的......
使用 np.array_split 将数据帧拆分为更小的块(虽然不能保证 numpy 函数可以工作,但现在可以,尽管它曾经有一个错误)。
然后 pickle 较小的数据帧。
当你解开它们时,使用 pandas.append 或 pandas.concat 将所有东西粘在一起。
我同意这是一种捏造和次优的做法。如果有人可以提出 "proper" 答案,我很想看看它,但我认为它就像数据帧一样简单,不应该超过一定的大小。
Split a large pandas dataframe
直到 pickle/pandas 方面的某处得到修复, 我会说更好的选择是使用替代 IO 后端。 HDF 适用于大型数据集 (GB)。所以你不需要添加额外的 split/combine 逻辑。
df.to_hdf('my_filename.hdf','mydata',mode='w')
df = pd.read_hdf('my_filename.hdf','mydata')
尝试使用压缩。它对我有用。
data_df.to_pickle('data_df.pickle.gzde', compression='gzip')
我 运行 遇到了同样的问题,并将原因追溯到内存问题。根据 this recourse 这通常不是由内存本身引起的,而是将太多资源移动到交换 space 中。我能够通过禁用与命令(在 link 中提供)一起禁用交换来保存大 pandas 文件:
swapoff -a