我正在尝试使用多线程读取格式如下的文件:
0 0 1 1 0 1 0 1
0 1 0 0 0 1 1 1
1 1 1 0 1 1 0 0
其中每行是一个字符串,例如第一个是:
"0 0 1 1 0 1 0 1"
并将其存储为如下矩阵:
[[0, 0, 1, 1, 0, 1, 0, 1],
[0, 1, 0, 0, 0, 1, 1, 1],
[1, 1, 1, 0, 1, 1, 0, 0]]
到目前为止,我已经提出了:
from multiprocessing.dummy import Pool
def splitline(line):
values = [int(char) for char in line.split()]
return values
with open("file.txt", "r") as file:
chunk = len(file.readlines()[0])
file.seek(0)
with Pool(4) as pool:
matrix = pool.map(splitline, file, chunk)
但是它比仅仅使用map()慢:
with open("file.txt", "r") as file:
matrix = []
for line in file:
matrix.append([value for value in map(int, line.split())])
任何人都可以告诉我多线程在做什么错吗?
谢谢!
答案 0 :(得分:2)
在不知道文件有多大的情况下,很明显,在您的第一个摘录中,chunk = len(file.readlines()[0])
在单个进程中将整个文件都存储到内存中。然后,启动4个进程(很多开销!),并将字符串拆分成块。
在第二个片段中,您逐行读取文件,然后完成。这消除了所有的多处理开销,并直接切入正题。对于file.readlines()
所需的所有CPU能力,您已经完成了所有工作并通过逐行读取而构建了矩阵,而第一个代码段只是在启动这些过程。
多处理在这里没有帮助,增加了开销和复杂性,无济于事。