Простой способ хранения данных из нескольких процессов - PullRequest
1 голос
/ 02 сентября 2010

У меня есть скрипт Python, который делает что-то вроде:

def MyScript(input_filename1, input_filename2):
   return val;

т.е. для каждой пары входных данных я вычисляю некоторое значение с плавающей запятой.Обратите внимание, что val - это простой double / float.

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

Что я делал раньше, так это выводил это значение в текстовый файл: input1_input2.txt.Тогда у меня будет 1000000 файлов, которые мне нужно уменьшить в один файл.Этот процесс не очень быстрый, так как ОС не любит папки, в которых слишком много файлов.

Как эффективно получить все эти данные на одном компьютере?Возможно, когда MongoDB запущен на компьютере, и все процессы отправляют данные вместе?

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

Ответы [ 4 ]

1 голос
/ 03 сентября 2010

Если входные данные имеют естественный порядок, и каждый работник может выяснить, «на каком» входе он работает, вы можете выбрать один файл на машину. Поскольку числа с плавающей точкой Python имеют длину 8 байт, каждый работник записывает результат в свой собственный 8-байтовый слот в файле.

import struct

RESULT_FORMAT = 'd' # Double-precision float.
RESULT_SIZE = struct.calcsize(RESULT_FORMAT)
RESULT_FILE = '/tmp/results'

def worker(position, input_filename1, input_filename2):
    val = MyScript(input_filename1, input_filename2)
    with open(RESULT_FILE, 'rb+') as f:
        f.seek(RESULT_SIZE * position)
        f.write(struct.pack(RESULT_FORMAT, val))

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

(Обратите внимание, что в Windows вам может потребоваться дополнительная настройка, чтобы разрешить общий доступ к файлу между процессами.)

1 голос
/ 03 сентября 2010

Вы можете использовать поддержку параллельной обработки Python.

Специально я бы упомянул NetWorkSpaces.

1 голос
/ 03 сентября 2010

Вы можете создать структуру папок, которая содержит сгенерированные подпапки, которые содержат сгенерированные подпапки.

Например, у вас есть основная папка, которая содержит 256 подпапок, и каждая подпапка содержит 256 подпапок.3 уровня будет достаточно.Вы можете использовать подстроки руководств для генерации уникальных имен папок.

Таким образом, guid AB67E4534678E4E53436E становится папкой AB, содержащей подпапку 67, и эта папка содержит папку E4534678E4E53436E.

Использование 2-х подстрок по 2 символа позволяет создать 256 * 256 папок.Более чем достаточно для хранения 1 миллиона файлов.

0 голосов
/ 02 сентября 2010

Вы можете запустить одну программу, которая собирает выходные данные, например, через XMLRPC.

...