2012-12-21 13 views
5

Opracowałem narzędzie używające python/cython, które sortuje pliki CSV i generuje statystyki dla klienta, ale wywołanie pool.map wydaje się wywoływać wyjątek zanim moja zmapowana funkcja ma szansę wykonać . Sortowanie niewielkiej liczby plików wydaje się działać zgodnie z oczekiwaniami, ale ponieważ liczba plików rośnie do 10, otrzymuję poniższy IndexError po wywołaniu pool.map. Czy ktoś zdaje sobie sprawę z tego błędu poniżej? Każda pomoc jest bardzo doceniana.Python multiprocessing pool.map podnosi IndexError

Podczas gdy kod jest pod NDA, stosowanie, sprawa jest dość prosta:

Przykładowy kod:

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 

wyjściowa:

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

traceback pokażesz zawiera inną varia ble nazwa ('sorted_dict') niż ta w kodzie przykładowym (' wyniki'), która sugeruje, że nie publikujesz aktualnego kodu, który działa i generuje błąd. – BrenBarn

+0

Typo z mojej strony - zmienna wyników pochodziła z bardzo podobnej funkcji, która oblicza statystyki. Naprawiłem literówkę. – Cryo

Odpowiedz

14

IndexError jest błąd, który dostajesz gdzieś w sort_file(), czyli w podprocesie. Jest on ponownie podnoszony przez proces nadrzędny. Podobno multiprocessing nie podejmuje żadnej próby poinformowania nas o tym, skąd naprawdę pochodzi błąd (np. Na temat tego, które linie wystąpiły), ani nawet o tym, jaki argument powodował to w argumencie sort_file(). Nienawidzę multiprocessing jeszcze bardziej :-(

+0

Prawidłowo! Odkryłem, że jeden z moich plików CSV nie zawierał kolumny. Dzięki za spojrzenie! – Cryo

0

Odjazd dalej w komendzie wyjście W Pythonie 3.4 przynajmniej multiprocessing.pool będzie pomocny wydrukować RemoteTraceback nad traceback procesu nadrzędnego Zobaczysz coś takiego:..

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 

W powyższym przypadku, kod błędu jest podniesienie w /path/to/your/code/here.py", line 80

zobaczyć również debugging errors in python multiprocessing

Powiązane problemy