Я пытаюсь параллельно обрабатывать некоторый файл, читая куски и обрабатывая каждый кусок, используя библиотеки многопроцессорности. Ниже мой код:Python Multiprocessing IndexError
from multiprocessing import Pool
from itertools import islice
import traceback
#Produce key value pairs (Date, Market_Share*Market_Share)
def Map(L):
results = []
for w in L:
temp = w.split(',')
Date = temp[0]
Share = float(temp[1][:-1])
ShareSquare = str(Share*Share)
results.append((Date,ShareSquare))
return results
if __name__=='__main__':
pool = Pool(2)
f = open('C:/Users/Daniel/Desktop/Project/Optiver/atchm_9450.csv','r')
fw = open('C:/Users/Daniel/Desktop/Project/Optiver/marketshare.csv','w')
f.readline()
while True:
next_n_lines = list(islice(f,16))
if not next_n_lines:
break
else:
l = pool.map(Map,next_n_lines)
f.close()
fw.close()
Однако он производит индекс из ошибки диапазона:
Traceback (most recent call last):
File "trial.py", line 29, in <module>
l = pool.map(Map,next_n_lines)
File "/usr/lib/python2.7/multiprocessing/pool.py", line 251, in map
return self.map_async(func, iterable, chunksize).get()
File "/usr/lib/python2.7/multiprocessing/pool.py", line 558, in get
raise self._value
IndexError: list index out of range
Объект список, который я прошел в функцию Map это что-то вроде [ '6/26/2014,68.90 \ n ',' 6/27/2014,68.84 \ n ',' 6/30/2014,68.80 \ n '....]
Он работает правильно, когда нет параллелизма (пул не вызывается).
В чем причина такого поведения?
Thx. Проблема в том, что функции Map фактически не нужно выполнять итерацию цикла for, потому что у pool.map уже есть механизм, чтобы разбить список на куски и параллельно проходить через каждый кусок. Таким образом, аргумент функции Map должен быть элементом, а не списком. Первоначально я думал, что pool.map делит список на несколько «подписок», и эти вспомогательные списки должны быть переданы в функцию. – user2517984