Mam następujący kod napisany, aby mój leniwy drugi rdzeń procesora działał. Zasadniczo po prostu znajdź żądane pliki "morze" w hierarchii katalogów, a następnie wykonaj zestaw skryptów zewnętrznych, aby przetworzyć te binarne pliki "morze", aby utworzyć od 50 do 100 tekstów i plików binarnych. Ponieważ tytuł pytania sugeruje w sposób równoległy, aby zwiększyć szybkość przetwarzania.Korzystanie z puli wieloprocesowej pracowników
To pytanie pochodzi z długiej dyskusji, którą prowadziliśmy na liście użytkowników IPython zatytułowanej "Cannot start ipcluster". Począwszy od moich eksperymentów na równoległych funkcjach przetwarzania IPython.
Problem polega na tym, że nie mogę poprawnie uruchomić tego kodu. Jeśli w folderach zawierających pliki "morze" znajdują się tylko pliki "morze", skrypt kończy wykonywanie bez pełnego wykonywania zewnętrznych skryptów. (Załóżmy, że mam uruchamiane 30-50 zewnętrznych skryptów, ale mój skrypt obsługujący wiele procesorów działa tylko po wykonaniu pierwszego skryptu w łańcuchu zewnętrznych skryptów.) Co ciekawe, jeśli uruchomię ten skrypt na już przetworzonym folderze (który jest "morskim" plikiem przetwarzane wcześniej, a pliki wyjściowe są już w tym folderze), a następnie działa, ale tym razem dostaję przyspieszenia na poziomie około 2,4 do 2,7X w odniesieniu do czasu przetwarzania liniowego. Nie jest to zbyt oczekiwane, ponieważ mam tylko procesor Core 2 Duo 2,5 Ghz w moim laptopie. Chociaż mam procesor GPU z obsługą CUDA, nie ma to nic wspólnego z moją obecną równoległą walką komputerową :)
Co według ciebie może być źródłem tego problemu?
Dziękujemy za wszystkie uwagi i sugestie.
#!/usr/bin/env python
from multiprocessing import Pool
from subprocess import call
import os
def find_sea_files():
file_list, path_list = [], []
init = os.getcwd()
for root, dirs, files in os.walk('.'):
dirs.sort()
for file in files:
if file.endswith('.sea'):
file_list.append(file)
os.chdir(root)
path_list.append(os.getcwd())
os.chdir(init)
return file_list, path_list
def process_all(pf):
os.chdir(pf[0])
call(['postprocessing_saudi', pf[1]])
if __name__ == '__main__':
pool = Pool(processes=2) # start 2 worker processes
files, paths = find_sea_files()
pathfile = [[paths[i],files[i]] for i in range(len(files))]
pool.map(process_all, pathfile)
Zamiast wywoływać górny zewnętrzny skrypt, kiedy próbuję wywołać podskrypt będący częścią postprocessing_saudi mianowicie process_raw i wykonać, otrzymuję tajemniczy błąd: Poniżej znajduje się tylko część błędu. Jak pokazano, wykonanie IDL jest zdezorientowane i nie można uzyskać odpowiednich wyników. [gsever @ ccn partest] $ python proall3.py PID: 17722 PID: 17723 IDL wersja 7.1 (Linux x86 m32). (c) 2009 r. ITT Visual Information Solutions IDL wersja 7.1 (Linux x86 m32). (c) 2009 r., ITT Visual Information Solutions % Nie można uzyskać statusu pliku. Jednostka: 0, Plik: Niepoprawny deskryptor pliku –