2016-07-04 10 views
0

Ich habe eine peinliche parallelen Schleife:Wie diese peinliche parallel Schleife mit Python parallelisieren

# Definitions 

def exhaustiveExplorationsWithSimilarityAll(inputFolder, outputFolder, similarityMeasure): 
    phasesSpeedupDictFolder=parsePhasesSpeedupDictFolder(inputFolder) 
    avgSpeedupProgramDict=computeAvgSpeedupProgram(phasesSpeedupDictFolder) 
    parameters={ 
     PROGRAMSPHASESSPEEDUPDICTS:phasesSpeedupDictFolder, 
     PROGRAMSAVGSPEEDUPDICT:avgSpeedupProgramDict 
    } 
similarityHandler= SimilarityHandler(similarityMeasure,parameters) 



# Sequential running 

for fileName in os.listdir(inputFolder): 
    print fileName 
    exhaustiveExplorationsWithSimilarity(inputFolder + fileName, outputFolder + fileName, similarityHandler) 

und ich möchte es Parallel mit Joblib parallel auszurichten:

# Parallel version 

num_cores = multiprocessing.cpu_count() 

parallel= Parallel(n_jobs=num_cores) 
    for fileName in os.listdir(inputFolder): 
     print fileName 
     parallel(delayed(exhaustiveExplorationsWithSimilarity(inputFolder + fileName, outputFolder + fileName, similarityHandler))) 

OR andere Version :

arg_generator = ((inputFolder + fileName, outputFolder + fileName, similarityHandler) for fileName in os.listdir(inputFolder)) 
parallel(delayed(exhaustiveExplorationsWithSimilarity)(arg_generator)) 

Aber beim Laufen Beschwerden mit:

parallel(delayed(exhaustiveExplorationsWithSimilarity(inputFolder + fileName, outputFolder + fileName, similarityHandler))) 
    File "/usr/lib/pymodules/python2.7/joblib/parallel.py", line 516, in __call__ 
    for function, args, kwargs in iterable: 
TypeError: 'function' object is not iterable 

Was fehlt mir hier? Jede Hilfe wird geschätzt.

+1

Hi Amir, es sieht so aus, als ob dieses Programm viele Probleme mit der Einrückung hat. Können Sie das bitte korrigieren, damit wir verstehen, was das Programm eigentlich macht? – 2ps

+0

Es sieht so aus, als ob Sie tatsächlich noch * exhaustiveExplorationsWithSimilarity' in Ihrer Schleife aufrufen und dann das * result * davon verzögern. Wahrscheinlich müssen Sie einfach die Funktion übergeben und die Argumente verzögern? –

+0

Lassen Sie mich einen Versuch mit Ihrer Antwort versuchen. Ja, Sie haben Recht – Amir

Antwort

1

Sie noch exhaustiveExplorationsWithSimilarity anrufen (seriell) innerhalb der Schleife, aber dann sind vorbei Sie das Ergebnis delayed

Aus der Dokumentation https://pythonhosted.org/joblib/parallel.html#common-usage, sieht es aus wie Sie etwas tun müssen, wie:

parallel = Parallel(n_jobs=num_cores) 
parallel(delayed(exhaustiveExplorationsWithSimilarity)(inputFolder + fileName, outputFolder + fileName, similarityHandler) for fileName in os.listdir(inputFolder)) 
+0

Der gleiche Fehler: "Datei" /usr/lib/pymodules/python2.7/joblib/parallel.py ", Zeile 516, in __call__ für Funktion, Args, Kwargs in iterable: TypeError: 'Funktion 'Objekt ist nicht iterierbar' – Amir

+0

Ich denke, wir sollten den Typ von 'fileName' so ändern, dass er iterierbar ist. Recht? – Amir

+0

Nicht 100% was du damit meinst, also ... vielleicht! –