2011-07-22 18 views
5

Mam skrypt Pythona, który uruchamia narzędzie wieloprocesorowe, aby osobno przetwarzać wiele plików. Zwykle mam limit cpu na poziomie 8. Mój problem jest po uruchomieniu przez jakiś czas zawsze otrzymuję "IOError: [Errno 24] Zbyt wiele otwartych plików". Każdy proces potomny otwiera kilka plików do odczytu tylko za pomocą file.open(). Te funkcje obsługi plików są przekazywane do wielu funkcji w celu pobrania danych. Na końcu każdego procesu potomnego pliki te są zamykane przy pomocy file.close(). Próbowałem również instrukcji with, ale nie rozwiązałem problemu. Czy ktoś ma pojęcie, co jest nie tak. Szukałem go, ale nie znalazłem żadnych odpowiedzi. Zamykam pliki, a funkcje zwracają się prawidłowo, więc to, co utrzymuje pliki obsługi plików wokół.Zbyt wiele plików jest otwieranych w trybie wieloprocesowym.Pool

Moje ustawienia to Mac 10.5 z Pythona 2.6

Dzięki

Ogan

from custom import func1, func2 
    # func1 and func2 only seek, read and return values form the file 
    # however, they do not close the file 
    import multiprocessing 
    def Worker(*args): 
     f1 = open("db1.txt") 
     f2 = open("db2.txt") 
     for each in args[1]: 
      # do many stuff 
      X = func1(f1) 
      Y = func2(f2) 

     f1.close() 
     f2.close() 
     return 

    Data = {1:[2], 2:[3]} 
    JobP= multiprocessing.Pool(8) 
    jobP.map_async(Worker, Data.items()) 
    jobP.close() 
    jobP.join() 
+1

pokazać nam swój kod, dzięki czemu możemy zobaczyć, kiedy pliki zostają zamknięte, itd – agf

+0

@agf. Dzięki za pomoc. Bardzo długie jest umieszczenie tutaj podstawowej idei. – Ogan

+1

Jeśli jest zbyt długa, aby opublikować, należy ją zmniejszyć do minimum, aby wywołać problem, a następnie opublikować. W ten sposób możesz nawet samemu znaleźć problem. – agf

Odpowiedz

0

Aby zmienić limit liczba plików otwartych w Yosemite (OS X 10.10):

sudo launchctl limit maxfiles [number-of-files] unlimited 
Powiązane problemy