Pandas数据帧过大,无法追加到Dask数据帧中?

3

我不确定自己缺少了什么,我以为dask可以解决我的内存问题。我有100多个以.pickle格式保存的pandas数据框,我想将它们全部放入同一个数据框中,但总是遇到内存问题。我已经增加了jupyter中的内存缓冲区。似乎在创建dask数据框时可能漏掉了某些东西,因为它似乎会在完全填满RAM后导致笔记本崩溃(也许)。有什么建议吗?

以下是我使用的基本流程:

import pandas as pd
import dask.dataframe as dd

ddf = dd.from_pandas(pd.read_pickle('first.pickle'),npartitions = 8)
for pickle_file in all_pickle_files:
    ddf = ddf.append(pd.read_pickle(pickle_file))
ddf.to_parquet('alldata.parquet', engine='pyarrow')
  • 我尝试了各种 npartitions,但没有数字能让代码完成运行。
  • 总的来说,我有大约30GB的捆绑数据框,我想要合并。
  • 也许这不是正确的库,但文档建议dask应该能够处理这个问题。

几个问题:在追加之后,df.npartitions的输出是什么? 一个pickle文件是否适合内存? - rpanai
追加最终失败(在完成之前),笔记本将重新启动。 - jb4earth
我认为分区的数量可能只需要比我设定的要高得多。 - jb4earth
1个回答

1
您是否考虑先将pickle文件转换为parquet,然后再加载到dask中?我假设您的所有数据都在名为"raw"的文件夹中,并且您想要移动到"processed"文件夹中。
import pandas as pd
import dask.dataframe as dd
import os

def convert_to_parquet(fn, fldr_in, fldr_out):
    fn_out = fn.replace(fldr_in, fldr_out)\
               .replace(".pickle", ".parquet")
    df = pd.read_pickle(fn)
    # eventually change dtypes
    
    df.to_parquet(fn_out, index=False)

fldr_in = 'data'
fldr_out = 'processed'
os.makedirs(fldr_out, exist_ok=True)

# you could use glob if you prefer
fns = os.listdir(fldr_in)
fns = [os.path.join(fldr_in, fn) for fn in fns]

如果您知道只有一个文件可以放在内存中,那么您应该使用循环。
for fn in fns:
    convert_to_parquet(fn, fldr_in, fldr_out)

如果您知道更多的文件适合存储在内存中,您可以使用delayed

from dask import delayed, compute

# this is lazy
out = [delayed(fun)(fn) for fn in fns]
# now you are actually converting
out = compute(out)

现在你可以使用Dask来进行分析。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接