2010-08-29 1 views
5

Я написал программу, которая вызывает функцию со следующим прототипом:Запуск нескольких экземпляров программы python эффективно и экономично?

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 раз (для 10000 различных значений «п») в кратчайшие & наиболее экономичным способом. после этих прогонов у меня будет 10 000 различных двоичных файлов с результатами всех отдельных сканирований. обратите внимание, что каждая функция «run» независима (это означает, что между отдельными прогонами не существует никакой зависимости).

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

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

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

+2

Что делает «процесс»? Без дополнительной информации я не думаю, что легко увеличить скорость более чем на 2 раза (при условии, что это двухъядерный процессор). – kennytm

+0

KennyTM: спасибо за ваш ответ. даже если время выполнения уменьшается вдвое (что маловероятно), мне все равно потребуется 2,5 года для запуска всего. следовательно, здесь основное внимание уделяется параллелизующей стороне проблемы. если у вас есть хорошая идея для этого, это было бы здорово. –

ответ

1

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

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

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

+0

bnery: двоичные файлы не кэшируются в памяти, поскольку они слишком большие и не могут помещаться в память. Я читаю файлы с помощью mmap(), который очень, очень быстро. –

9

Заканчивать PiCloud: http://www.picloud.com/

import cloud 
cloud.call(function) 

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

+0

очень интересно. спасибо, что привлекли это мое внимание. –

+0

+1 для ссылки на PiCloud ... довольно интересно :) – elo80ka

1

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

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

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

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

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

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

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

PyTables vs Numpy Memmap

Смежные вопросы