Проблемы с памятью и распределением Dask: в несколько раз больше данных загружается в память и не происходит утечки данных - PullRequest
2 голосов
/ 14 июля 2020

Я запускаю несколько простых тестов с распределенным Dask и Datashader, но у меня возникают две проблемы, которые я не могу решить, и не понимаю, почему это происходит.

Данные, с которыми я работаю with состоит из 1,7 миллиарда строк по 97 столбцов в каждой, распределенных на 64 файла паркета. Мой тестовый код выглядит следующим образом, в котором я просто рисую два столбца данных в виде диаграммы рассеяния, следуя примеру кода внизу https://datashader.org/user_guide/Performance.html:

def plot(file_path):
    dask_df = dd.read_parquet(file_path,  engine='pyarrow') 
    cvs = ds.Canvas(plot_width=600, plot_height=300)
    agg = cvs.points(dask_df, 'x', 'y')
    img = tf.shade(agg, cmap=['lightblue', 'darkblue'])
    return img

futures = [dask_client.submit(plot,file) for f in files_paths]
result = [f.result() for f in futures]  #array with each plot per file

две проблемы следующие:

Во-первых, мои рабочие берут слишком много данных в память. Например, я запускал предыдущий код только с одним рабочим и одним файлом. Несмотря на то, что один файл имеет размер 11 ГБ, на панели инструментов Dask отображается около 50 ГБ, загруженных в память. Единственное решение, которое я нашел для этого, - изменить следующую строку, объясняя небольшой фрагмент столбцов:

def plot(file_path):
    dask_df = dd.read_parquet(file_path,  columns=['x','y',...], engine='pyarrow') 
    …

Хотя это работает (и имеет смысл, потому что я использую только 2 столбца для графика ) все еще непонятно, почему рабочие используют столько памяти.

Вторая проблема заключается в том, что, хотя я настроил в своем файле ~ / .config / dask / distribution.yaml, что на 70% разлив должно произойти, мои рабочие процессы продолжают падать, потому что им не хватает памяти:

распределенный.nanny - ПРЕДУПРЕЖДЕНИЕ - Рабочий превысил 95% бюджета памяти. Перезапуск распределенного .nanny - ПРЕДУПРЕЖДЕНИЕ - Перезапуск рабочего

Наконец, когда я рисую все точки, отображая только 5 столбцов с columns=['x','y','a','b','c'] при чтении данных, я получаю неоправданно медленное время. Несмотря на то, что файлы разделены на 8 дисков для ускорения ввода-вывода и работы с 8 ядрами (8 рабочих), для построения 1,7 миллиарда точек требуется 5 минут.

Я использую: dask 2.18. 0, распространялась 2.19.0, datashader 0.10.0 и python 3.7.7.

Я боролся с этим целую неделю, поэтому буду очень признателен за любые советы. Не стесняйтесь спрашивать меня о любой другой информации, которая может отсутствовать.

1 Ответ

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

Хотя это работает (и имеет смысл, потому что я использую только 2 столбца для графика), все еще не понятно, почему рабочие используют столько памяти.

Паркет - это относительно эффективный формат. Например, ваши данные могут быть сжаты на диске, но не сжаты в Pandas, или строковый тип Pandas может вызывать некоторое раздувание (Pandas использует Python строки, которые имеют большой размер).

Вторая проблема заключается в том, что, хотя я сконфигурировал в моем файле ~ / .config / dask / distribution.yaml, что при 70% утечка должна произойти, мои рабочие процессы продолжают давать сбой, потому что им не хватает памяти:

Я не уверен, что вам сказать с этим. Dask не может остановить Python функций от нехватки оперативной памяти. Я хотел бы поговорить с ребятами из datashader, но ожидал бы, что их код будет довольно жестким.

Наконец, когда я рисую все точки, получаю только 5 столбцов с columns = ['x', 'y', 'a', 'b', 'c'] при чтении данных я получаю необоснованно медленное время. Несмотря на то, что файлы разделены на 8 дисков для ускорения ввода-вывода и работы с 8 ядрами (8 рабочих), для построения 1,7 миллиарда точек требуется 5 минут.

Трудно диагностировать производительность проблемы с переполнением стека. Я рекомендую следовать приведенным здесь инструкциям: https://docs.dask.org/en/latest/understanding-performance.html

...