flexible-size只读(仅附加)共享内存对象/列表列表 - 正确的存储方式?

时间:2017-12-05 12:29:05

标签: python python-2.7 multiprocessing shared-memory python-multiprocessing

数据:我有两个非常长的列表(每个最多500M元素),这些列表是由我的并行程序部分密集使用(只读,无修改)。首先是字符串列表,第二个是整数列表。两个列表中的元素长度(字符串或列表)可能从少数(大多数情况)到几百或几千(罕见情况)的字母/整数不等。 在并行代码(子进程)中,列表用作只读数据。并行执行完成后,可以通过main-process将新元素添加(追加到列表)到列表中。

问题:问题是在流程之间共享此类数据的最佳方式是什么?以下是考虑的解决方案(我知道)。如果我错过了什么,请发表评论。

可能的解决方案:

  1. 来自multiprocessing module的数组。它是suggested,它可以与numpy数组结合使用。这个解决方案似乎是最合理的。但是在需要固定长度的元素时 - 这对我来说是一个真正的问题。我没有足够的RAM来将数组元素大小设置为可能出现的最长项目的长度。在这种方法中,我认为最有效的方法是将元素长度设置为某个合理的值(这将能够存储大多数条目),剩余的最长条目存储是具有足够大的元素长度的第二个数组。
  2. 主要进程的os.fork(数据部分中描述的列表)。它只是unix,但对我来说这不是问题。它应该受益于写时复制。但是两个字符串(第一个列表的元素)和列表(第二个列表的元素)都是对象和probably reference counting will cause that each time data will be copy
  3. redis(o其他可以在ram中存储数据的数据库)。我真的很担心performans
  4. 存储为mmap个对象。这给了我巨大的字符串式(和类文件)对象。搜索(迭代)它可能是我程序中最耗时的部分。
  5. 以原始形式存储在一个进程中,并使用队列/管道与其他进程通信。以前,当我使用multiprocess.pool.imap与进程之间的小chunksize通信杀死性能。因此,我认为这种解决方案不适用于真正的高流量。
  6. 因此,基于上述情况,在我看来,最合理的解决方案是使用Array和numpy(选项1)并尝试将每个列表拆分为几个具有不同元素长度的数组。有什么意见,建议吗?我错过了什么吗?

0 个答案:

没有答案