#python #pandas #dask-dataframe
Вопрос:
У меня есть таблица postgresql объемом 7 ГБ, которую я хочу прочитать в python и провести некоторый анализ. Я не могу использовать для этого Pandas, потому что он больше, чем память на моей локальной машине. Поэтому я хотел сначала попробовать прочитать таблицу в фрейме данных Dask, выполнить некоторую агрегацию и переключиться обратно на Pandas для последующего анализа. Для этого я использовал приведенные ниже строки кода.
df = dd.read_sql_table('table_xyz', uri = "postgresql psycopg2://user:pwd@remotehost/dbname", index_col = 'column_xyz', schema = 'private')
Index_col, т. е. «column_xyz», индексируется в базе данных. Это работает, но когда я выполняю действие, например агрегацию, для возврата результата требуется целая вечность (например, час).
avg = df.groupby("col1").col2.mean().compute()
Я понимаю, что Dask не так быстр, как Панды, тем более, когда я работаю на одной машине, а не на кластере. Мне интересно, правильно ли я использую Dask? Если нет, то какая более быстрая альтернатива для выполнения анализа больших таблиц, которые не помещаются в памяти, с использованием Python.
Ответ №1:
Если ваши данные помещаются в оперативную память вашей машины, вам лучше использовать Панд. В некоторых случаях Даск не превзойдет Панд. В качестве альтернативы вы можете поиграть с размером куска и посмотреть, улучшится ли ситуация. Лучший способ разобраться в этом-взглянуть на панель инструментов диагностики dask и выяснить, почему dask так долго. Это поможет вам принять гораздо более обоснованное решение.
Комментарии:
1. Не могли бы вы сослаться на любую ссылку, где подробно объясняется размер фрагмента Dask.dataframe. Я не смог найти ни одного ресурса, подробно рассказывающего о выборе размера кусков.
2. Я только что понял, что размер фрагмента не используется с read_sql_table, потому что вам нужно разбить на разделы с помощью столбца индекса. Кроме того, вы вычисляете среднее значение, используя фрейм данных pandas, поэтому вы не используете для этого dask. Попробуйте рассчитать среднее значение с помощью фрейма данных dask(очень похожие команды на pandas) и проверьте панель диагностики.
3. Спасибо за ваши комментарии. Я установил параметр ‘bytes_per_chunk’ в 30 МБ вместе с обязательным параметром ‘index_col’, и это помогло. Теперь действие завершено за 9 минут, что является приемлемым.