2012-12-21 9 views
5

Ho sviluppato un'utilità che utilizza python/cython che ordina i file CSV e genera statistiche per un client, ma richiamare pool.map sembra sollevare un'eccezione prima che la funzione mappata abbia la possibilità di eseguire . L'ordinamento di un piccolo numero di file sembra funzionare come previsto, ma quando il numero di file cresce a 10, ottengo il seguente IndexError dopo aver chiamato pool.map. Qualcuno capita di riconoscere l'errore qui sotto? Qualsiasi aiuto è molto apprezzato.Python multiprocessing pool.map genera IndexError

Mentre il codice è sotto NDA, il caso d'uso è abbastanza semplice:

codice di esempio:

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 

uscita:

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

il traceback si mostra contiene un diverso varia nome ('ordered_dict') di quello nel tuo esempio di codice (' results'), che suggerisce che non stai pubblicando il codice reale che viene eseguito e genera l'errore. – BrenBarn

+0

Typo da parte mia - la variabile dei risultati proveniva da una funzione molto simile che calcola le statistiche. Ho corretto l'errore di battitura. – Cryo

risposta

14

L'IndexError è un errore si ottiene da qualche parte in sort_file(), cioè in un sottoprocesso. È controrilanciato dal processo genitore. Apparentemente multiprocessing non fa alcun tentativo di informarci su da dove proviene realmente l'errore (ad esempio, su quali righe si è verificato) o anche su quale argomento ha sort_file(). Odio multiprocessing ancora più :-(

+0

corretto! Ho scoperto che uno dei miei file CSV mancava una colonna. Grazie per aver dato un'occhiata! – Cryo

0

controllare più in alto nel comando di uscita In Python 3.4, almeno, multiprocessing.pool sarà utilmente stampare un RemoteTraceback al di sopra del traceback processo padre Vedrai qualcosa di simile a:..

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 

Nel caso di cui sopra, il codice sollevando l'errore è a /path/to/your/code/here.py", line 80

vedi anche debugging errors in python multiprocessing