Запускать несколько экземпляров программы на Python эффективно и экономно? - PullRequest
5 голосов
/ 29 августа 2010

Я написал программу, которая вызывает функцию со следующим прототипом:

def Process(n):

    # the function uses data that is stored as binary files on the hard drive and 
    # -- based on the value of 'n' -- scans it using functions from numpy & cython.    
    # the function creates new binary files and saves the results of the scan in them.
    #
    # I optimized the running time of the function as much as I could using numpy &  
    # cython, and at present it takes about 4hrs to complete one function run on 
    # a typical winXP desktop (three years old machine, 2GB memory etc).

Моя цель - запустить эту функцию ровно 10000 раз (для 10 000 различных значений 'n') самым быстрым и экономичным способом. после этих прогонов у меня будет 10000 различных двоичных файлов с результатами всех отдельных проверок. обратите внимание, что каждая функция 'run' является независимой (то есть, между отдельными запусками нет никакой зависимости).

Итак, вопрос в следующем. имея только один ПК дома, очевидно, что мне потребуется около 4,5 лет (10 000 пробежек x 4 часа на пробежку = 40 000 часов ~ = 4,5 года), чтобы завершить все пробежки дома. Тем не менее, я хотел бы, чтобы все пробеги были завершены в течение недели или двух.

Я знаю, что решение будет включать доступ ко многим вычислительным ресурсам одновременно. Какой самый лучший (самый быстрый / самый доступный, так как мой бюджет ограничен) способ сделать это? я должен купить сильный сервер (сколько это будет стоить?) или я могу запустить его онлайн? в таком случае, раскрывается ли мой пропритационный код при этом?

В случае, если это помогает, каждому экземпляру Process () требуется только около 500 МБ памяти. спасибо.

Ответы [ 3 ]

9 голосов
/ 29 августа 2010

Проверьте PiCloud: http://www.picloud.com/

import cloud
cloud.call(function)

Может быть, это простое решение.

1 голос
/ 30 августа 2010

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

Редактировать: я только что понялчто вы имели в виду больше облачных вычислений, а не запускали несколько процессов на одной машине ... Однако мой совет все еще остается верным ... PyTables весьма полезен для вычислений вне ядра!

Вы упомянули, что используете mmap для доступа к данным.Следовательно, время выполнения, вероятно, сильно зависит от того, как ваши данные структурированы на диске.

Memmapping может на самом деле быть довольно медленным в любой ситуации, когда физическое оборудование должно тратить большую часть своего времени на поиск (например, чтение среза по плоскости постоянной Z в C-упорядоченном трехмерном массиве).Один из способов смягчить это - изменить порядок упорядочения ваших данных, чтобы уменьшить количество запросов, необходимых для доступа к частям, которые вам, скорее всего, понадобятся.

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

Хорошая новость заключается вчто есть очень гибкая, ориентированная на numy библиотека, которая уже собрана, чтобы помочь вам с обоими из них.Взгляните на pytables .

Я был бы очень удивлен, если бы tables.Expr значительно (~ 1 порядок) не превзошел ваши вычисления вне ядра с использованием массива memmapped. Смотрите здесь для хорошего, (хотя и консервированного) примера.Из этого примера:

PyTables vs Numpy Memmap

1 голос
/ 29 августа 2010

Имеет ли Process доступ к данным двоичных файлов напрямую или вы кешируете их в памяти?Должно помочь сокращение использования операций ввода-вывода.

Кроме того, нельзя ли разбить Process на отдельные функции, работающие параллельно?Как зависит зависимость данных внутри функции?

Наконец, вы можете попробовать какую-нибудь службу облачных вычислений, такую ​​как Amazon EC2 (не забудьте прочитать это дляинструменты), но это будет недешево (EC2 стоит от $ 0,085 в час) - альтернативой будет посещение университета с компьютерным кластером (в настоящее время они довольно распространены, но будет проще, если вы там кого-то знаете).

...