В настоящее время я работаю над рефакторингом некоторой устаревшей аналитики в Python / DASK, чтобы показать эффективность этого решения в будущем.
Я пытаюсь настроить демонстрационный сценарий и у меня возникают проблемы спамяти и хотелось бы несколько советов.
Мой сценарий;Мои данные разбиты на сжатые файлы 52 gzip на S3, каждый из которых, несжатый в памяти, составляет около 100 МБ, что дает общий размер набора данных ~ 5,5 ГБ и ровно 100 000 000 строк.
Мой планировщик находится на T2.Medium (4GB / 2vCPU), как и мои 4 рабочих.Каждый рабочий выполняется с 1 процессом, 1 потоком и пределом памяти в 4 ГБ, т. Е. dask-worker MYADDRESS --nprocs 1 --nthreads=1 --memory-limit=4GB
.
Теперь я извлекаю файлы паркета и немедленно перераспределяю столбец таким образом, что яв конечном итоге примерно 480 разделов каждый из ~ 11MB.
Затем я использую map_partitions для основной работы.Это хорошо работает для небольших наборов данных, однако для набора данных 100 mil мои работники продолжают падать из-за нехватки памяти.Что я здесь не так делаю?Для информации, специфичной для реализации, функции, которую я передаю в map_partitions, иногда может потребоваться примерно 1 ГБ, из-за того, что по сути является перекрестным соединением на фрейме данных раздела.
Я не понимаю, что делать с архитектурой DASK?Между моим планировщиком и четырьмя моими работниками имеется 20 ГБ памяти для работы, но этого оказывается недостаточно.Из того, что я прочитал из документации DASK, является то, что, если каждый раздел и то, что вы делаете с этим разделом, помещается в память рабочего, то с вами все должно быть в порядке?
Разве 4 ГБ просто нетдовольно?Нужно ли больше для обработки планировщика / межпроцессного взаимодействия?
Спасибо за чтение.