2012-12-21 88 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