Ich frage mich, ob jemand von euch weiß, warum meine Leistung schrecklich ist;
Was ich erreichen möchte; Generieren Sie 2,2 Millionen Dateien. Um jede Datei zu erstellen, werden durchschnittlich 2-5 Datenbankanrufe benötigt.
Der Server, an dem ich arbeite, hat 24 Kerne und 190 GB RAM.
Ich habe die Dateien, die ich generieren muss, in 24 Chargen aufgeteilt.
Whey Ich benutze folgenden Code, ich bekomme miese Leistung. Der Generierungsprozess dauert eine Stunde.
%Vor%Wenn ich jedoch sicherstelle, dass mein Programm einen Parameter empfängt, weiß das Programm, welcher Batch generiert werden soll. Daher muss ich die parallele Funktionalität nicht verwenden. Wenn ich das Programm für jeden Stapel mit der folgenden .bat-Datei ausführe;
%Vor%Es läuft unglaublich schnell! Der gesamte Generierungsprozess dauert weniger als 15 Minuten! Diese Batch-Datei stellt auch sicher, dass jeder Kern eine CPU-Nutzung von ca. 90% hat. Wenn ich den parallelen Ansatz verwende, erhalte ich nur 30-40%.
Hat jemand dafür eine logische Erklärung? Ich war mit diesem Projekt zufrieden, weil ich endlich die Möglichkeit hatte, die .NET 4 Parallel-Bibliothek in Kombination mit EF zu benutzen, aber leider hat es mich ein bisschen enttäuscht: -)
Ich persönlich habe eine leichte Befürchtung, dass EF hier der Engpass ist ... Werden intern einige Dinge zwischengespeichert, die einige Sperren verursachen, wenn mehrere Prozesse Daten abrufen?
Erleuchte mich: -)
Ich kann nicht sagen, warum Ihre andere EXE-Datei gut funktioniert, aber ich kann Ihnen einen Vorschlag für den Code geben, den Sie präsentieren.
Sie haben erwähnt, dass Sie Ihre Arbeit in 24 Chargen aufgeteilt haben. Dann haben Sie ForEach über die Chargenliste verwendet. Mit diesem Setup scheint es, dass jeder unserer 24 Kerne gleichzeitig an 1 Datei arbeiten kann. Ich vermute, das ist Ihr Engpass.
Jeder Kern könnte viel mehr tun, wenn Sie es zulassen. Versuchen Sie etwas wie folgt:
%Vor%Oder Sie können die Stapel ganz loswerden und die vollständige Liste der Dateien angeben. Die parallele Task-Bibliothek wird dafür sorgen, dass mehrere Cores für Sie verwendet werden.
%Vor%Sie wissen das wahrscheinlich schon, aber denken Sie daran, dass der Kontext nicht ist thread safe , so dass Sie innerhalb der parallelsten.ForEach-Struktur eine neue erstellen müssen.
Tags und Links entity-framework performance frameworks parallel-processing entity