使用多线程将文件存储为整数矩阵
Store a file as a matrix of integers using multi-threading
我正在尝试使用多线程来读取格式如下的文件:
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())])
谁能告诉我我在多线程中做错了什么?
谢谢!
在不知道您的文件有多大的情况下,在您的第一个代码段中很清楚 chunk = len(file.readlines()[0])
将整个文件以 single-process 的形式插入内存。然后启动 4 个进程(大量开销!)并将字符串拆分为块。
在您的第二个代码段中,您逐行读取文件并完成。这消除了所有多处理开销并直接切入正题。对于 file.readlines()
所需的所有 CPU 功能,您已经完成了所有工作并通过逐行阅读构建了矩阵,而第一个片段刚刚启动流程。
多处理在这里没有帮助,增加开销和复杂性没有任何好处。
我正在尝试使用多线程来读取格式如下的文件:
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())])
谁能告诉我我在多线程中做错了什么?
谢谢!
在不知道您的文件有多大的情况下,在您的第一个代码段中很清楚 chunk = len(file.readlines()[0])
将整个文件以 single-process 的形式插入内存。然后启动 4 个进程(大量开销!)并将字符串拆分为块。
在您的第二个代码段中,您逐行读取文件并完成。这消除了所有多处理开销并直接切入正题。对于 file.readlines()
所需的所有 CPU 功能,您已经完成了所有工作并通过逐行阅读构建了矩阵,而第一个片段刚刚启动流程。
多处理在这里没有帮助,增加开销和复杂性没有任何好处。