代码之家  ›  专栏  ›  技术社区  ›  Dat Chu

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

  •  1
  • Dat Chu  · 技术社区  · 14 年前

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

    def MyScript(input_filename1, input_filename2):
       return val;
    

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

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

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

    我想要些简单的。我知道我可以用MPI来完成这个任务,但我认为对于这样一个简单的任务来说,这是一种过度的杀伤力。

    4 回复  |  直到 7 年前
        1
  •  1
  •   dhaffey    14 年前

    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上,您可能需要一些额外的设置来允许在进程之间共享文件。)

        2
  •  1
  •   pyfunc    14 年前

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

    特别是,我要提到网络空间。

        3
  •  1
  •   TTT    14 年前

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

    例如,主文件夹包含256个子文件夹,每个子文件夹包含256个子文件夹。三层就够了。您可以使用guid的子字符串来生成唯一的文件夹名称。

    因此guid ab67e453467e4e53436e成为包含子文件夹67的文件夹AB,并且该文件夹包含文件夹e45344678e4e53436e。

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

        4
  •  0
  •   leoluk    14 年前

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