2012-12-21 60 views
5

我使用python /用Cython的排序CSV文件和一个客户端生成统计数据开发了一个实用工具,但是调用pool.map似乎引发异常我映射函数有机会执行前。对少量文件进行排序似乎按预期运行,但随着文件数增加到10,在调用pool.map之后,我得到下面的IndexError。有人碰巧认识到下面的错误吗?任何帮助是极大的赞赏。Python的多pool.map引发IndexError

虽然代码是NDA下,用例是相当简单:

代码示例:

def sort_files(csv_files): 
    pool_size = multiprocessing.cpu_count() 
    pool = multiprocessing.Pool(processes=pool_size) 
    sorted_dicts = pool.map(sort_file, csv_files, 1) 
    return sorted_dicts 

def sort_file(csv_file): 
    print 'sorting %s...' % csv_file 
    # sort code 

输出:

File "generic.pyx", line 17, in generic.sort_files (/users/cyounker/.pyxbld/temp.linux-x86_64-2.7/pyrex/generic.c:1723) 
    sorted_dicts = pool.map(sort_file, csv_files, 1) 
    File "/usr/lib64/python2.7/multiprocessing/pool.py", line 227, in map 
    return self.map_async(func, iterable, chunksize).get() 
    File "/usr/lib64/python2.7/multiprocessing/pool.py", line 528, in get 
    raise self._value 
IndexError: list index out of range 
+0

您展示回溯包含不同的杂物ble名称('sorted_dict')比您的代码示例('results')中的名称更糟糕,这表示您不会发布运行并生成错误的实际代码。 – BrenBarn

+0

我的部分是Typo - 结果变量来自一个非常类似的计算统计数据的函数。我修复了错字。 – Cryo

回答

14

的IndexError是一个错误你在sort_file()中的某处,即在一个子进程中。它由父进程重新提出。显然multiprocessing不作任何试图告诉我们什么地方出错,其实就是从(它发生例如上线),甚至只是什么参数sort_file()造成的。我恨multiprocessing更:-(

+0

正确!我发现我的一个csv文件丢失了一列。谢谢参观! – Cryo

0

进一步检查了在命令输出 在Python 3.4,至少,multiprocessing.pool会帮忙,打印父进程回溯高于RemoteTraceback你会看到类似这样的:。

multiprocessing.pool.RemoteTraceback: 
""" 
Traceback (most recent call last): 
    File "/usr/lib/python3.4/multiprocessing/pool.py", line 119, in worker 
    result = (True, func(*args, **kwds)) 
    File "/usr/lib/python3.4/multiprocessing/pool.py", line 44, in mapstar 
    return list(map(*args)) 
    File "/path/to/your/code/here.py", line 80, in sort_file 
    something = row[index] 
IndexError: list index out of range 
""" 

The above exception was the direct cause of the following exception: 

Traceback (most recent call last): 
    File "generic.pyx", line 17, in generic.sort_files (/users/cyounker/.pyxbld/temp.linux-x86_64-2.7/pyrex/generic.c:1723) 
    sorted_dicts = pool.map(sort_file, csv_files, 1) 
    File "/usr/lib64/python2.7/multiprocessing/pool.py", line 227, in map 
    return self.map_async(func, iterable, chunksize).get() 
    File "/usr/lib64/python2.7/multiprocessing/pool.py", line 528, in get 
    raise self._value 
IndexError: list index out of range 

在上述情况下,提高了错误代码是/path/to/your/code/here.py", line 80

也看到debugging errors in python multiprocessing