熊猫数据框太大而无法追加到dask数据框?

时间:2020-08-04 17:28:34

标签: python pandas dataframe jupyter dask

我不确定我在这里缺少什么,我以为dask可以解决我的内存问题。我有100多个以.pickle格式保存的熊猫数据框。我想将它们全部放在同一数据帧中,但一直遇到内存问题。我已经在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应该能够处理此问题

1 个答案:

答案 0 :(得分: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进行分析了。