1

我正在测试 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._success 检查调用函数成功:

def successful(self):
    assert self._ready
    return self._success

因此 get 函数会重新检查作业是否已完成。大概他们已经有了,因为我们刚刚在之前调用的 if 语句中通过了该检查。返回值应该是一个对象(不是 int),然后溢出。

想法?

4

0 回答 0