我正在测试Python多处理模块,以从同一文件中读取不同的缓冲区偏移量。偏移是先验已知的并且被索引为“行”。
代码如下所示:
def get_object(row):
return file.get(row) #Where get seeks to the offset and returns the data object.
rows = range(len(file)) #This gets the row ids.
pool = mp.Pool()
results = pool.map(get_object, rows)
print results
这会返回溢出错误。本网站上有大量关于溢出错误的帖子,但通常是由于范围问题或人们试图创建巨大的列表。行数在1024到100,000之间......根本不算太大。
我可以打印结果,看到错误发生在迭代结束时。我相信这与map如何加入对象列表有关。它应该维持秩序,所以我不应该在那里遇到任何问题。
错误:OverflowError: Python int too large to convert to C long
更新:查看源代码,在pool.py的第528行(Enthought Python 2.7)中引发了错误。这是get
类的ApplyResult
方法。
以下是我认为代码正在执行的功能和演练:
def get(self, timeout=None)
self.wait(timeout)
if not self._ready:
raise TimeoutError
if self._success:
return self._value
else:
raise self._value
这在上面的函数中由map调用。 self._ready检查正在通过,因为我没有看到TimeoutError。 self._ccess检查调用函数成功:
def successful(self):
assert self._ready
return self._success
因此,get函数会重新检查作业是否已完成。据推测,他们刚刚在之前调用的if语句中通过了该检查。返回值应该是一个对象(不是int),然后溢出。
想法?