задание dask убито из-за использования памяти?

Привет, у меня есть скрипт Python, который использует библиотеку dask для обработки очень большого фрейма данных, большего, чем физическая память. Я замечаю, что задание прекращается в середине выполнения, если использование памяти в течение некоторого времени остается на уровне 100% компьютера.

Это ожидается? Я бы подумал, что данные будут перенесены на диск, и на диске останется много места.

Есть ли способ ограничить общее использование памяти? Спасибо

РЕДАКТИРОВАТЬ:

Я также пробовал:

dask.set_options (доступная_память = 12e9)

Это не работает. Похоже, это не ограничивало использование памяти. Опять же, когда использование памяти достигает 100%, задание уничтожается.


person Bo Qiang    schedule 24.01.2018    source источник
comment
Насколько велики ваши данные? Вы получаете сообщение об ошибке? Dask должен использовать память только при вызове dd.compute(), где dd — ваш фрейм данных dask.   -  person jpp    schedule 24.01.2018
comment
Можете ли вы опубликовать код, чтобы увидеть, как вы вызываете методы dask? Кроме того, вы проверяли, потребляют ли даск-процессы 100% памяти?   -  person Anil_M    schedule 24.01.2018
comment
Размер файла CSV составляет около 90 ГБ без сжатия, а моя физическая память составляет 16 ГБ. Самая затратная часть — глобальная сортировка через set_index(). В основном код выглядит так: ddf = dd.read_csv(*.csv), ddf = ddf.set_index(sort_col).compute(). Никаких сообщений об ошибках, кроме того, что система сообщает мне, что задание было убито. Я запускаю его в экземпляре EC2.   -  person Bo Qiang    schedule 24.01.2018
comment
Код, который вы вызываете, должен быть частью вопроса, а не только в комментариях.   -  person mdurant    schedule 24.01.2018


Ответы (2)


Линия

 ddf = ddf.set_index("sort_col").compute()

фактически загружает весь фрейм данных в память и конвертирует в pandas. Вы хотите удалить .compute() и применить любую логику (фильтрацию, группировку/агрегацию и т. д.), которую вы хотите, прежде чем вызывать compute, чтобы получить достаточно маленький результат.

Важно помнить, что результирующий вывод должен умещаться в памяти, и каждый фрагмент, обрабатываемый каждым рабочим потоком (плюс накладные расходы), также должен умещаться в памяти.

person mdurant    schedule 24.01.2018

Попробуйте просмотреть данные по частям с помощью:

chunksize = 10 ** 6 for chunk in pd.read_csv(filename, chunksize=chunksize): process(chunk)

person rodcoelho    schedule 24.01.2018
comment
Спасибо за ваш ответ. В коде мне нужно сделать глобальную сортировку через set_index(). Могу ли я по-прежнему обрабатывать его кусками? - person Bo Qiang; 24.01.2018
comment
К сожалению нет. Поблочная обработка таким образом отлично подходит для накопления/агрегирования, но не для чего-либо, что нельзя сделать независимо для каждого фрагмента. - person mdurant; 24.01.2018