У меня есть файл паркета, который имеет 800K строк x 8,7K столбцов.Я загрузил его в файл данных dask:
import dask.dataframe as dd
dask_train_df = dd.read_parquet('train.parquet')
dask_train_df.info()
Это дает:
<class 'dask.dataframe.core.DataFrame'>
Columns: 8712 entries, 0 to 8711
dtypes: int8(8712)
Когда я пытаюсь выполнить простые операции, такие как dask_train_df.head()
или dask_train_df.loc[2:4].compute()
, я получаю ошибки памяти,даже с 17+ ГБ ОЗУ.
Однако, если я сделаю:
import pandas as pd
train = pd.read_parquet('../input/train.parquet')
train.info()
, вы получите:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 800000 entries, 0 to 799999
Columns: 8712 entries, 0 to 8711
dtypes: int8(8712)
memory usage: 6.5 GB
, и я смогу запустить train.head()
и train.loc[2:4]
без проблем, так как все уже находится в памяти.
1) Итак, мой вопрос: почему эти простые операции увеличивают использование памяти с помощью Dask Dataframe, но прекрасно работают, когда я загружаю все в память, используяPandas Dataframe?
Я заметил, что npartitions=1
, и я вижу, что в документации read_parquet
"считывает каталог данных Parquet в Dask.dataframe, один файл на раздел".В моем случае это звучит так, как будто я теряю всю мощь распараллеливания, связанную с наличием нескольких разделов, но разве использование памяти Dask Dataframe не должно ограничиваться объемом памяти одного Pandas Dataframe?
2) Кроме того, дополнительный вопрос: если бы я хотел распараллелить этот единственный файл паркета, разбив его на Dask Dataframe, как бы я это сделал?Я не вижу параметра размера блока в сигнатуре dd.read_parquet
.Я также пытался использовать функцию перераспределения, но я считаю, что разделы вдоль строк и в файле паркета, я хотел бы разделить вдоль столбцов?