Чтение текстовых файлов с многопроцессорной обработкой медленнее, чем без - PullRequest
2 голосов
/ 23 марта 2020

У меня есть несколько текстовых файлов, которые мне нужно прочитать с помощью Python. Текстовые файлы содержат только массив чисел с плавающей запятой (ie без строк), а размер массива - 2000 на 2000. Я пытался использовать пакет multiprocessing, но по какой-то причине он теперь работает медленнее. Время, которое у меня есть на моем p c для приведенного ниже кода, составляет

  • Многопоточность: 73,89 с
  • Однопоточность: 60,47 с

Что я тут не так делаю, есть ли способ ускорить эту задачу? Мой p c работает на процессоре Intel Core i7, и в реальной жизни у меня есть несколько сотен таких текстовых файлов, 600 или даже больше.

import numpy as np
from multiprocessing.dummy import Pool as ThreadPool
import os
import time
from datetime import datetime


def read_from_disk(full_path):
    print('%s reading %s' % (datetime.now().strftime('%H:%M:%S'), full_path))
    out = np.genfromtxt(full_path, delimiter=',')
    return out

def make_single_path(n):
    return r"./dump/%d.csv" % n

def save_flatfiles(n):
    for i in range(n):
        temp = np.random.random((2000, 2000))
        _path = os.path.join('.', 'dump', str(i)+'.csv')
        np.savetxt(_path, temp, delimiter=',')


if __name__ == "__main__":
    # make some text files
    n = 10
    save_flatfiles(n)

    # list with the paths to the text files
    file_list = [make_single_path(d) for d in range(n)]

    pool = ThreadPool(8)
    start = time.time()
    results = pool.map(read_from_disk, file_list)
    pool.close()
    pool.join()
    print('finished multi thread in %s' % (time.time()-start))

    start = time.time()
    for d in file_list:
        out = read_from_disk(d)
    print('finished single thread in %s' % (time.time() - start))
    print('Done')

1 Ответ

1 голос
/ 23 марта 2020

Вы используете multiprocessing.dummy, который копирует API многопроцессорной обработки, но на самом деле это оболочка для модуля потоков.

Итак, в основном вы используете Threads вместо Process. И threads в python бесполезны (из-за GIL), когда вы хотите выполнить вычислительные задачи.

Замените:

from multiprocessing.dummy import Pool as ThreadPool

С:

from multiprocessing import Pool

Я пытался запустить ваш код на моей машине с i5 processor, он завершился за 45 секунд. так что я бы сказал, что это большое улучшение.

Надеюсь, это прояснит ваше понимание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...