2014-11-24 3 views
0

Я пытаюсь параллельно обрабатывать некоторый файл, читая куски и обрабатывая каждый кусок, используя библиотеки многопроцессорности. Ниже мой код: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 '....]

Он работает правильно, когда нет параллелизма (пул не вызывается).

В чем причина такого поведения?

ответ

0

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

Date = temp[0] 
    Share = float(temp[1][:-1]) 

Try, чтобы проверить, что ж достаточно данных.

+0

Thx. Проблема в том, что функции Map фактически не нужно выполнять итерацию цикла for, потому что у pool.map уже есть механизм, чтобы разбить список на куски и параллельно проходить через каждый кусок. Таким образом, аргумент функции Map должен быть элементом, а не списком. Первоначально я думал, что pool.map делит список на несколько «подписок», и эти вспомогательные списки должны быть переданы в функцию. – user2517984