Ich habe den folgenden Code geschrieben, um meinen faulen zweiten CPU-Kern zum Laufen zu bringen. Der Code sucht zunächst die gewünschten "sea"-Dateien in der Verzeichnishierarchie und führt dann eine Reihe von externen Skripten aus, um diese binären "sea"-Dateien zu verarbeiten und 50 bis 100 Text- und Binärdateien zu erzeugen. Wie der Titel der Frage nahelegt, geschieht dies parallel, um die Verarbeitungsgeschwindigkeit zu erhöhen.
Diese Frage stammt aus der langen Diskussion, die wir auf der IPython-Benutzerliste mit dem Titel "" geführt haben. ipcluster kann nicht gestartet werden ". Ich beginne mit meinen Experimenten zu den Parallelverarbeitungsfunktionalitäten von IPython.
Das Problem ist, dass ich diesen Code nicht richtig zum Laufen bringen kann. Wenn die Ordner, die "sea"-Dateien enthalten, nur "sea"-Dateien enthalten, beendet das Skript seine Ausführung, ohne externe Skriptläufe vollständig durchzuführen. (Angenommen, ich muss 30-50 externe Skripte ausführen, aber mein Skript mit aktiviertem Multiprocessing erschöpft sich erst nach der Ausführung des ersten Skripts in dieser externen Skriptkette). Interessanterweise läuft das Skript, wenn ich es in einem bereits verarbeiteten Ordner ausführe (d. h. in den zuvor verarbeiteten "See"-Dateien und den Ausgabedateien, die sich bereits in diesem Ordner befinden), aber dieses Mal erhalte ich Geschwindigkeitssteigerungen von etwa dem 2,4- bis 2,7-fachen der linearen Verarbeitungszeiten. Das ist nicht unbedingt zu erwarten, da ich nur eine Core 2 Duo 2.5 Ghz CPU in meinem Laptop habe. Obwohl ich einen CUDA-gesteuerten Grafikprozessor habe, hat das nichts mit meinem derzeitigen Kampf gegen parallele Berechnungen zu tun :)
Was könnte Ihrer Meinung nach die Ursache für dieses Problem sein?
Ich danke Ihnen für alle Kommentare und Vorschläge.
#!/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)
0 Stimmen
Anstatt das obere externe Skript aufzurufen, erhalte ich einen mysteriösen Fehler, wenn ich versuche, das Teilskript aufzurufen, das Teil des postprocessing_saudi ist, nämlich process_raw und execute: Das Folgende ist nur ein Teil des Fehlers. Wie gezeigt, ist die IDL-Ausführung verwirrt und kann nicht zu einem richtigen Ergebnis führen. [gsever@ccn partest]$ python proall3.py PID: 17722 PID: 17723 IDL Version 7.1 (linux x86 m32). (c) 2009, ITT Visual Information Solutions IDL Version 7.1 (linux x86 m32). (c) 2009, ITT Visual Information Solutions % Der Dateistatus kann nicht abgerufen werden. Unit: 0, Datei: <stdin> Schlechter Dateideskriptor