Python中多进程从中心源读取的快速方法?

Python中多进程从中心源读取的快速方法?,python,performance,queue,multiprocessing,Python,Performance,Queue,Multiprocessing,我正在寻找一种多进程(在multiprocessing.Pool()中)从中央数据源读取数据的快速方法。目前,我有一个文件被读入队列(使用multiprocessing.Manager().queue()),然后启动一个工作池并从该队列读取其进程。它工作得很好,但是当我处理多个GBs大小的文件时,这会成为一个问题,因为托管队列的速度比常规python队列慢约7倍 我认为这是因为管理器处于一个单独的进程中,它必须通过套接字进行通信,而不是直接与内存进行通信 下面是我正在使用的代码(get_reco

我正在寻找一种多进程(在multiprocessing.Pool()中)从中央数据源读取数据的快速方法。目前,我有一个文件被读入队列(使用multiprocessing.Manager().queue()),然后启动一个工作池并从该队列读取其进程。它工作得很好,但是当我处理多个GBs大小的文件时,这会成为一个问题,因为托管队列的速度比常规python队列慢约7倍

我认为这是因为管理器处于一个单独的进程中,它必须通过套接字进行通信,而不是直接与内存进行通信

下面是我正在使用的代码(get_records函数只是从文件中读取每条记录的bytestream并返回它)

也许有更好的方法来处理这个问题


以下是有关将我的一个数据文件(~3GB)读入各种数据类型的速度的一些统计数据:

阅读常规python列表。速率为229.377 MB/秒

l = []
map(l.append, get_records(f))
读入常规队列。速率为74.035 MB/秒

import Queue
q = Queue.Queue()
map(q.put, get_records(f))
正在读取到multiprocessing.queues队列。速率为67.718 MB/秒

from multiprocessing import Queue
mq = Queue()
map(mq.put, get_records(f))
最后读入一个托管队列。速率为9.568 MB/秒

from multiprocessing import Manager
manager = Manager()
mgr_q = manager.Queue()
map(mgr_q.put, get_records(f))

速率是通过
rate=duration/filesize/1024/1024

计算的。如果您只是在读取文件,那么同时读取多个进程是安全的。只需传递偏移量和计数,而不是在队列中传递数据。而在工人中:

f.seek(offset)
get_records(f, count)

队列
并不意味着要传输大量数据。尝试将实际数据放入共享内存中,只通过
队列
@Sven:好的,我会研究一下。我刚刚运行了一个测试,将整数添加到队列中,托管队列仍然比常规队列慢十倍()。在这里使用指向内存的指针会有什么不同吗?@Sven:无论如何,我会继续实现它,看看它对性能的影响。这里的要点是以某种方式减少添加到队列中的条目数。如果你把问题分成太多的部分,你的经理就会成为瓶颈。尽量在工作人员中做更多的工作(例如将数据拆分为记录)。这很有意义。我正在考虑将记录以块的形式传递到队列中,比如说,一次传递100条记录。感谢您的建议,但这没有明显的区别——例如,在解析65MB文件的情况下,将执行时间从35秒减少到34秒。添加记录块(正如Sven在OP评论中建议的那样)产生了巨大的差异。我正在测试块的大小,看看哪一个是最有效的。谢谢是的,我所说的“计数”是你所说的“块大小”。
f.seek(offset)
get_records(f, count)