многопроцессорная обработка Python, импорт текстовых файлов - PullRequest
0 голосов
/ 16 октября 2018

Я имею дело с многопроцессорной обработкой Python, и я хотел бы понять, можно ли с ней сэкономить время.

У меня есть три txt-файла, которые должны быть прочитаны Python.Поэтому я определил функцию, которая открывает текстовый файл и читает его построчно.Входные данные, необходимые для этой функции, это просто имя txt-файла:

import multiprocessing as mp
output=mp.Queue()
def funct_imp(name):
     [...]
     output.put([var1,var2,var3])
     return (var1,var2,var3)

Затем я сравнил первый скрипт:

res01=funct_imp(name01)
res02=funct_imp(name02)
res03=funct_imp(name03)

со вторым, в котором я использую многопроцессорную обработку Python:

for name in [name01,name02,name03]:
    pool=mp.Process(target=func_imp,args=name)
    pool.start()
    res=output.get()

Теперь у меня есть два основных вопроса:

  1. Как получить результаты по всем процессам?В конце я нахожу в res те же самые результаты res03
  2. Первый сценарий выполняется за 18 секунд, а второй - за 25 секунд.Я ожидал, что все будет наоборот (на самом деле я ожидал большего сокращения времени).

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Попробуйте вместо этого использовать пул многопроцессорной обработки:

from multiprocessing import Pool

def f(x):
    -- process the file here --

if __name__ == '__main__':
    p = Pool()
    print(p.map(f, [name01, name02, name03]))

source: https://docs.python.org/2/library/multiprocessing.html

0 голосов
/ 16 октября 2018
import multiprocessing as mp

def read_file(name):
   lines = []
   with open(name) as fp:
       lines = fp.readlines()
   return lines

if __name__ == '__main__':
    names = ['file1.txt', 'file2.txt']  # list of filenames
    pool = mp.Pool()
    results = pool.map(read_file, names)

Это будет считывать все строки в память, используйте pool.imap для более медленной версии, наряду с уступающими строками в read_file.
results будет списком строк.

...