我有一个Python脚本可以执行以下操作:
def MyScript(input_filename1, input_filename2):
return val;
即。对于每对输入,我计算一些浮点值。请注意,val是一个简单的double / float。
由于这个计算非常密集,我将在不同的进程中运行它们(可能在同一台计算机上,可能在多台计算机上)。
之前我做的是将此值输出到文本文件:input1_input2.txt。然后我将有1000000个文件,我需要将其缩减为一个文件。这个过程不是很快,因为操作系统不喜欢文件太多的文件夹。
如何有效地将所有这些数据整合到一台计算机中?也许在计算机上运行MongoDB并且所有进程都会发送数据?
我想要一些简单的事情。我知道我可以在MPI中做到这一点,但我认为这对于这么简单的任务来说太过分了。
答案 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。