Эффективная память SMP в питоне

У меня сложный в вычислительном отношении проект, который, кажется, является хорошим кандидатом для распараллеливания. Код использует большое количество контуров ГИС и занимает примерно 1,5 ГБ памяти как единый процесс. Существует два уровня логики, которые можно распараллелить: внешний уровень, который разбивает область проекта на более мелкие (но все же довольно большие) области, и внутренний цикл, который выполняет много математических операций с довольно короткими сегментами.

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

Я еще не пытался распараллелить внутренний цикл, но должен быть в состоянии разбить код и контуры на относительно небольшие объекты (~10 КБ), не считая внешних модулей (аккуратно). Хотя существует множество вариантов параллельной обработки для Python, я не нашел хорошего обсуждения о том, как лучше всего обрабатывать объекты и управлять памятью. Что такое хороший пакет / метод для эффективного отделения небольшого объекта в новый процесс от гораздо более крупного процесса?

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

Изменить: Подавляющее большинство обработки находится в пакете Shapley, который является интерфейсом Python для GEOS, который находится в C (я думаю). В настоящее время я использую Python 2.7, но готов перейти на 3, если это выгодно.

0 ответов

Другие вопросы по тегам