Dask drop дублирует ошибки памяти split_out

У меня есть большой фрейм данных parquet dask (40 ГБ) с 600 разделами, и мне нужно drop_duplicates с dask.

Я заметил, что простой drop_duplicates всегда приводит к 1 разделу, поэтому я включил "split_out".

Паркетный файл с разделами был создан из csvs, каждый из которых уже был выведен.

Когда я его запускаю, я всегда получаю рабочие ошибки памяти, превышающие 95% памяти.

При наблюдении за приборной панелью я также заметил, что рабочие заполняют свое ОЗУ только примерно до 70% максимум, поэтому я не понимаю, почему у меня проблемы с памятью.

dataframe.map_partitions(lambda d: d.drop_duplicates('index')) 

.... не будет работать, так как он выполняет дедупликацию только в каждом разделе, но не по горизонтали.

Любая идея, как я могу рассчитать оптимальный размер раздела, чтобы drop_duplicates работал на моих 2 рабочих с 25 ГБ оперативной памяти каждый?

client = Client(n_workers=2, threads_per_worker=2, memory_limit='25000M',diagnostics_port=5001)
b=dd.read_parquet('output/geodata_bodenRaw.parq')
npart = int(b.npartitions)
print('npartitions are: ',npart)
b=b.drop_duplicates(subset='index',split_out=npart)
b=b.map_partitions(lambda d: d.set_index('index'))
b.to_parquet('output/geodata_boden.parq', write_index=True )

person user670186    schedule 13.05.2019    source источник
comment
@mdurant: не могли бы вы помочь?   -  person user670186    schedule 13.05.2019
comment
user670186, вы не можете ссылаться на пользователя, который еще не комментирует этот вопрос. См. это   -  person rpanai    schedule 16.05.2019
comment
Тогда map_partition предназначен для независимой работы в каждом разделе, поэтому ваше поведение является нормальным.   -  person rpanai    schedule 16.05.2019


Ответы (1)


При наблюдении за приборной панелью я также заметил, что рабочие заполняют свое ОЗУ только примерно до 70%, поэтому я не понимаю, почему у меня проблемы с памятью.

Даск начинает беспокоиться об этом уровне и начинает записывать данные на диск. Ему необходимо оставить немного свободной памяти для работы ваших функций. Информацию о том, как изменить эти политики, см. Здесь: https://distributed.dask.org/en/latest/worker.html#memory-management

В общем, уникальность или удаление дубликатов - дорогостоящая операция для параллельного выполнения, особенно для наборов данных с высокой мощностью. Использование параметра split_out - хорошая идея. В вашей ситуации я бы больше поиграл с этим.

person MRocklin    schedule 18.05.2019