我不确定我在这里缺少什么,我以为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
,但没有数字允许代码完成运行。答案 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进行分析了。