gpt4 book ai didi

python - 多处理问题

转载 作者:行者123 更新时间:2023-11-28 20:26:35 24 4
gpt4 key购买 nike

所以我只是尝试多处理并读取文本文档中的每一行。有 660918 行,我知道它们的长度都是一样的。虽然,使用以下代码,行的长度似乎发生了变化,但我不明白为什么。

import multiprocessing

class Worker(multiprocessing.Process):
def __init__(self,in_q):
multiprocessing.Process.__init__(self)
self.in_q = in_q
def run(self):
while True:
try:
in_q.get()
temp_line = short_file.readline()
temp_line = temp_line.strip().split()
print len(temp_line)
self.in_q.task_done()
except:
break

if __name__ == "__main__":
num_proc = 10
lines = 100000 #660918 is how many lines there actually are
in_q = multiprocessing.JoinableQueue()
File = 'HGDP_FinalReport_Forward.txt'
short_file = open(File)

for i in range(lines):
in_q.put(i)

for i in range(num_proc):
worker = Worker(in_q)
worker.start()
in_q.join()

最佳答案

您在主进程中打开一个文件,然后在子进程中读取该文件。你不能那样做。

在幕后,文件对象实际上是一个原始文件句柄和一个内存缓冲区。每个进程共享文件句柄,但每个进程都有自己的内存缓冲区。

假设所有行都是 50 字节,内存缓冲区是 4096 字节。

进程 1 调用 readline,它从文件中读取字节 0-4095 到它的缓冲区中,然后扫描该缓冲区以查找换行符,其中有 50 个字节,并返回前 50 个字节。到目前为止,还不错。

进程 2 调用 readline,它将文件中的字节 4096-8191 读取到其缓冲区中,然后扫描该缓冲区以查找换行符。第一个在 4100,这是 5 个字节,所以它返回前 5 个字节。

等等。

理论上您可以通过执行无缓冲 I/O 来解决这个问题,但实际上,为什么呢?为什么不只阅读主进程中的行?除了避免这个问题,这也可能会提高并行性——I/O 本质上是顺序的,所以所有这些进程将把大部分时间花在 I/O 上,这意味着它们对你没有任何好处。

作为旁注,在运行循环的顶部附近,您正在执行 in_q.get() 而不是 self.in_q.get()。 (这恰好有效,因为 in_q 是一个永远不会消失的全局变量,而 self.in_q 只是它的一个副本,但您不想依赖它。)

关于python - 多处理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11041036/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com