Сохраните файл как матрицу целых чисел, используя многопоточность - PullRequest
0 голосов
/ 15 июня 2019

Я пытаюсь использовать многопоточность для чтения файла, отформатированного так:

0 0 1 1 0 1 0 1
0 1 0 0 0 1 1 1
1 1 1 0 1 1 0 0

где каждая строка является строкой, например 1-й:

"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 Ответ

2 голосов
/ 15 июня 2019

Не зная, насколько велик ваш файл, из вашего первого фрагмента довольно ясно, что chunk = len(file.readlines()[0]) выгружает весь файл в память за один процесс.Затем вы запускаете 4 процесса (много накладных расходов!) И разбиваете строку на куски.

Во втором фрагменте вы читаете файл построчно и все готово.Это устраняет все затраты на многопроцессорную обработку и сокращает погоню.При всей мощности процессора, необходимой для file.readlines(), вы выполнили всю работу и построили матрицу, читая построчно, пока первый фрагмент только начинает запускать процессы.

Многопроцессорная обработказдесь не полезно, добавляя дополнительные издержки и сложность без выгоды.

...