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

Я начал работать над этим в R, но ничего не добился, так как процесс был настолько интенсивным, что я никогда не добился результатов ни на своем ноутбуке, ни на своем настольном компьютере. Я наблюдал за монитором своего процессора в течение нескольких секунд и увидел, насколько неэффективен этот процесс. Я купил 6-ядерный ноутбук i7, и когда мне нужно было раскрыть эту мощь, R использовал половину одного из них. Итак, я начал читать ...

Моим первым подходом к решению этой проблемы была многопоточность или многопроцессорность с использованием Microsoft R. Это не сильно помогло. Даже если у него есть библиотеки, которые могут использовать преимущества нескольких ядер, мне нужно, чтобы эти два вложенных цикла выполнялись быстрее, намного быстрее, и я все еще застрял с половиной ядра. Итак, я начал читать о различиях многопроцессорности и многопоточности в Python и нашел этот замечательный средний пост. Решением проблемы, с которой я столкнулся, была многопроцессорная обработка, то есть разделение задачи на отдельные, независимые более мелкие задачи и отправка по одной на каждое из ядер моего процессора. Это определенно ускорит работу.

Итак, я сделал это, я написал программу на Python и запустил ее на своем компьютере. 24 часа спустя у меня все еще не было результатов. Я провел несколько тестов и понял, что даже при полной мощности моего компьютера это займет около 6 дней. Так что мне пришлось сделать что-то другое. А вот и Digital Ocean.

Я в основном специалист по AWS. Но когда дело доходит до простого и быстрого тестирования, я всегда буду использовать DO. Я создал экземпляр самой мощной из имеющихся у них опций в разделе Оптимизированные для ЦП капли.

Я установил pandas (которые мне пришлось использовать), подключился через SFTP, загрузил программу и текстовые файлы, которые мне нужно было обработать, и через 5 минут я запустил свою программу в 32 ядрах капли. Отлично… Потом я пожадничал. После нескольких настроек и двух других капель того же размера менее чем за 30 минут задание было запущено на 96 ядрах! Сейчас мы говорим…

14 часов спустя процесс завершился, я загрузил файлы pickle, которые пришлось связать для создания набора данных, затем уничтожил капли, заплатил 25 долларов, и все. Безупречный и чистый.

Если вам нужен полный пример и более подробные инструкции, посетите этот репозиторий: https://github.com/ricardovm91/multiprocessing-python.

Несколько заключительных замечаний: во-первых, я знаю, что это можно сделать лучше с помощью API DO, я надеюсь написать об этом в будущем. Посмотрите этот другой пост в блоге на ту же тему, который мне действительно помог.

Удачного кодирования!

Если вы хотите с нами связаться, просто свяжитесь с нами через наш сайт.

Рикардо Веласкес.
2018–12–24
Бизнес-менеджер DataScience.