2014-11-24 67 views
0

我想通过读取块并通过使用多处理库来处理每个块来并行处理某个文件。以下是我的代码:Python多重处理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 

我传递到地图功能的列表对象是一样的东西['6月26日/ 2014,68.9​​0 \ n','6/27/2014,68.84 \ n','6/30/2014,68.80 \ n'....]

当没有涉及的并行性时,它可以正常工作(不调用池)。

什么可能导致此行为?

回答

0

乍一看,只有这两条线可以提高此异常:

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

尝试检查W具有足够的数据。

+0

Thx。问题在于Map函数实际上并不需要执行for循环迭代,因为pool.map已经具有将列表拆分为块并且并行遍历每个块的机制。所以Map函数的参数应该是一个元素而不是一个列表。我最初认为,pool.map将列表分成几个“子列表”,这些子列表应该传递给函数。 – user2517984 2014-11-24 14:55:10