Pandas фреймов данных слишком велики для добавления в фрейм данных dask? - PullRequest
3 голосов
/ 04 августа 2020

Я не уверен, что мне здесь не хватает, я думал, что dask решит мои проблемы с памятью. У меня есть 100+ pandas фреймов данных, сохраненных в формате .pickle. Я хотел бы получить их все в одном кадре данных, но по-прежнему сталкиваюсь с проблемами памяти. Я уже увеличил буфер памяти в jupyter. Кажется, мне может чего-то не хватать при создании фрейма данных dask, поскольку он, кажется, взломал sh мой ноутбук после полного заполнения моей оперативной памяти (возможно). Любые указатели?

Ниже приведен базовый c процесс, который я использовал:

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, но ни один номер не позволил коду fini sh работает.
  • всего есть около 30 ГБ обработанных фреймов данных, которые я хотел бы объединить
  • возможно, это не та библиотека, но документы предполагают, что dask должен иметь возможность справиться с этим

1 Ответ

1 голос
/ 05 августа 2020

Думали ли вы сначала преобразовать файлы 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]

Если вы знаете, что в памяти помещается не более одного файла, вы должны использовать al oop

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 для анализа.

...