2010-09-02 77 views
1

存储数据的简单方式我有一个Python脚本,做了沿着线:从多个进程

def MyScript(input_filename1, input_filename2): 
    return val; 

即每对输入的,我计算某些浮点值。请注意val是一个简单的double/float。由于这种计算非常密集,我将跨越不同的进程(可能在同一台计算机上,可能在多台计算机上)运行它们。

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

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

我想要简单的东西。我知道我可以在MPI中做到这一点,但我认为对于这样一个简单的任务来说是过度的。

回答

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密集型的,因为很多工人将被写入到操作系统缓存相同的页面。

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

0

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

1

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

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

所以引导AB67E4534678E4E53436E成为包含子文件夹67的文件夹AB,该文件夹包含文件夹E4534678E4E53436E。

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