【问题标题】:Simple way to storing data from multiple processes存储来自多个进程的数据的简单方法
【发布时间】:2010-09-02 19:45:16
【问题描述】:

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

def MyScript(input_filename1, input_filename2):
   return val;

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

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

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

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

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

【问题讨论】:

    标签: python mongodb mapreduce database nosql


    【解决方案1】:

    如果输入具有自然顺序,并且每个工作人员都可以找出它正在处理的“哪个”输入,那么您可以在每台机器上使用一个文件。由于 Python 浮点数是 8 字节长,因此每个 worker 会将结果写入文件中自己的 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 上,您可能需要一些额外的设置以允许在进程之间共享文件。)

    【讨论】:

      【解决方案2】:

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

      特别是,我会提到 NetWorkSpaces。

      【讨论】:

        【解决方案3】:

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

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

        因此 guid AB67E4534678E4E53436E 变为文件夹 AB,其中包含子文件夹 67,并且该文件夹包含文件夹 E4534678E4E53436E。

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-11-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-11-20
            • 2016-08-27
            相关资源
            最近更新 更多