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.90 \ n','6/27/2014,68.84 \ n','6/30/2014,68.80 \ n'....]
当没有涉及的并行性时,它可以正常工作(不调用池)。
什么可能导致此行为?
Thx。问题在于Map函数实际上并不需要执行for循环迭代,因为pool.map已经具有将列表拆分为块并且并行遍历每个块的机制。所以Map函数的参数应该是一个元素而不是一个列表。我最初认为,pool.map将列表分成几个“子列表”,这些子列表应该传递给函数。 – user2517984 2014-11-24 14:55:10