存储来自多个进程的数据的简单方法

时间:2010-09-02 19:45:16

标签: python mongodb mapreduce database nosql

我有一个Python脚本可以执行以下操作:

def MyScript(input_filename1, input_filename2):
   return val;

即。对于每对输入,我计算一些浮点值。请注意,val是一个简单的double / float。

由于这个计算非常密集,我将在不同的进程中运行它们(可能在同一台计算机上,可能在多台计算机上)。

之前我做的是将此值输出到文本文件:input1_input2.txt。然后我将有1000000个文件,我需要将其缩减为一个文件。这个过程不是很快,因为操作系统不喜欢文件太多的文件夹。

如何有效地将所有这些数据整合到一台计算机中?也许在计算机上运行MongoDB并且所有进程都会发送数据?

我想要一些简单的事情。我知道我可以在MPI中做到这一点,但我认为这对于这么简单的任务来说太过分了。

4 个答案:

答案 0 :(得分:1)

您可以使用python并行处理支持。

特别是,我会提到NetWorkSpaces。

答案 1 :(得分:1)

您可以生成包含生成的子文件夹的文件夹结构,这些子文件夹包含生成的子文件夹。

例如,您有一个包含256个子文件夹的主文件夹,每个子文件夹包含256个子文件夹。 3级深度就足够了。您可以使用guids子字符串生成唯一的文件夹名称。

因此guid AB67E4534678E4E53436E成为包含子文件夹67的文件夹AB,该文件夹包含文件夹E4534678E4E53436E。

使用2个2个字符的子字符串可以生成256 * 256个文件夹。足以存储100万个文件。

答案 2 :(得分:1)

如果输入对它们有自然顺序,并且每个工作人员都可以找到它正在处理的“哪个”输入,那么每台机器就可以获得一个文件。由于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))

与编写一堆小文件相比,这种方法的I / O密集程度也要低得多,因为许多工作人员将在OS缓存中写入相同的页面。

(请注意,在Windows上,您可能需要一些额外的设置以允许在进程之间共享文件。)

答案 3 :(得分:0)

您可以运行一个收集输出的程序,例如XMLRPC。