使用多线程将文件存储为整数矩阵

时间:2019-06-15 17:50:42

标签: python python-3.x python-multithreading

我正在尝试使用多线程读取格式如下的文件:

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())])

任何人都可以告诉我多线程在做什么错吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

在不知道文件有多大的情况下,很明显,在您的第一个摘录中,chunk = len(file.readlines()[0])在单个进程中将整个文件都存储到内存中。然后,启动4个进程(很多开销!),并将字符串拆分成块。

在第二个片段中,您逐行读取文件,然后完成。这消除了所有的多处理开销,并直接切入正题。对于file.readlines()所需的所有CPU能力,您已经完成了所有工作并通过逐行读取而构建了矩阵,而第一个代码段只是在启动这些过程。

多处理在这里没有帮助,增加了开销和复杂性,无济于事。