2016-07-01 5 views
-1

Ich suchte einige Beispiele auf Google, aber ich konnte nicht wirklich etwas finden, das ich brauche.C# Parallel/Multithread eine Weile

Ich habe diese while-Schleife:

StreamReader ImportFile = new StreamReader(@"c:\users\matthew\desktop\test.txt"); 

string line; 
while ((line = ImportFile.ReadLine()) != null) 
{ 
    doneTotal++; 

    string[] info = line.Split('-'); 
    string username = info.Length >= 1 ? info[0] : null; 
    string file = info.Length >= 2 ? info[1] : null; 

    myfunc(username, file); 
} 

So myfunc schnell, aber nicht schnell genug für mich. Wie kann ich diese While-Schleife parallel oder Multithread?

Danke.

+2

Ich bin mir ziemlich sicher, was langsam an Ihrem Prozess ist, ist I/O. Sie können I/O nicht für eine bessere Leistung multithread. Lesen Sie einfach die ganze Datei als eine Zeichenfolge und verarbeiten Sie jede Zeile separat. – Gus

+0

konnten Sie nicht in allen Zeilen lesen und dann über sie in einer parallelen foreach iterieren? –

+0

@Gus & Steven Die Dateien, die ich benutze, sind manchmal zu groß, um sie zu öffnen, also denke ich, dass ich das verwenden muss, außer es gibt eine andere Möglichkeit, eine große Datei zu öffnen. – wtm

Antwort

1

Nur auf eine Ahnung, versuchen Sie es. Fügen Sie zuerst eine neue Klasse hinzu, um eine Reihe von Parametern für myfunc darzustellen. (Es könnte sogar Tuple<string, string> sein).

public class MyFuncParameters 
{ 
    public string UserName { get; set; } 
    public string File { get; set; } 
} 

Dann Ihre ursprüngliche Methode wie folgt ändern:

StreamReader ImportFile = new StreamReader(@"c:\users\matthew\desktop\test.txt"); 

string line; 
var filesToProcess = new List<MyFuncParameters>(); 
while ((line = ImportFile.ReadLine()) != null) 
{ 
    doneTotal++; 

    string[] info = line.Split('-'); 
    string username = info.Length >= 1 ? info[0] : null; 
    string file = info.Length >= 2 ? info[1] : null; 

    filesToProcess.Add(new MyFuncParameters {File = file, UserName = username}); 
} 

foreach (var fileToProcess in filesToProcess) 
{ 
    myfunc(fileToProcess.UserName, fileToProcess.File); 
} 

Mit anderen Worten, lesen Sie zuerst alles, was Sie sich von der Datei, und dann, wenn Sie durch eine andere Liste der Dateien sind Iterieren (erstellt aus der Originaldatei) mach das nächste. Sie sehen möglicherweise eine verbesserte Leistung, wenn Sie nicht eine Datei lesen und dann etwas (myfunc) mit einer anderen Datei zwischen den Lesevorgängen der Originaldatei ausführen.

Das ist eine Vermutung. Es hängt sehr wahrscheinlich davon ab, was genau myfunc tut, da Sie angegeben haben, dass das der Teil ist, der langsam ist.

Wie in den Kommentaren erwähnt, können Sie so viele parallele Threads starten, um Dateien zu lesen, wie Sie wollen, aber nur einer von ihnen kann tatsächlich von der Festplatte zu einem Zeitpunkt lesen, so dass es nicht wirklich gut tut. Es könnte es sogar langsamer machen.

0

Ich dachte, ich hätte dies in meiner anderen Antwort gepostet, aber ich sehe es nicht.

Können Sie ändern, was Sie auf den Server posten, so dass Sie anstatt eine Menge Anfragen mit jeweils einem Benutzernamen und einem Dateinamen zu buchen, stattdessen eine Sammlung veröffentlichen? Eine (oder mehrere) große Anfragen werden viel schneller sein als viele kleine. Jedes Element benötigt die gleiche Zeit für die Verarbeitung, aber Sie entfernen den Aufwand für die Durchführung aller einzelnen Anrufe.

Verwandte Themen