我有一个我生成的大型腌制稀疏数据框架,但由于它太大而无法保存在内存中,因此我必须按生成后逐步追加,如下所示:
with open(data.pickle, 'ab') as output:
pickle.dump(df.to_sparse(), output, pickle.HIGHEST_PROTOCOL)
然后,为了读回文件,我执行以下操作:
df_2 = pd.DataFrame([]).to_sparse()
with open(data.pickle, 'rb') as pickle_file:
try:
while True:
test = pickle.load(pickle_file)
df_2 = pd.concat([df_2, test], ignore_index= True)
except EOFError:
pass
考虑到这个文件的大小(20 GB),这种方法有效,但显然需要很长时间。是否可以并行化pickle.load / pd.concat步骤以加快加载时间?或者是否有任何其他建议可以加快这个过程,特别是在代码的加载部分。
注意:生成步骤是在资源少得多的计算机上完成的,这就是为什么在更强大的计算机上完成的加载步骤可以将DF保存在内存中的原因。
谢谢!
答案 0 :(得分:2)
不要在循环中连接!这是文档中的note,也许应该是警告
df_list = []
with open(data.pickle, 'rb') as pickle_file:
try:
while True:
test = pickle.load(pickle_file)
df_list.append(test)
except EOFError:
pass
df_2 = pd.concat(df_list), ignore_index= True)
您现在正在循环中复制框架每个时间,并且它正在增长,所以这根本没有效率。
成语是附加到列表中,然后在最后执行单个concat。
此外,在数据生成中写入HDF5
文件会更好。哪个更快,可压缩。你通常可以写出一个完整的df,除非你打开压缩时非常稀疏。