2016-07-16 13 views
1

Ich möchte parallel hier Programmbearbeitung beschleunigen, ist Code:Wie Verarbeitung Zeile für Zeile mit C++

int main(){ 
ifstream fin("./europarl_clean_1-5000.en"); 
     ifstream fin2("./europarl_clean_1-5000.fr"); 
     while(!(fin.eof()&&fin2.eof())){ 
     string english,chinese; 
      getline(fin,english); 
      getline(fin2,chinese); 
      fun1(); 
      fun2(); 
      fun3(); 
     } 
} 

zwei Dateien enthält über 5000 Zeilen jeder Datei, ich möchte zu einem Zeitpunkt mehr als 2 Zeilen verarbeiten , dass ich Programmlaufzeit beschleunigen könnte, Der Code nur Zeile für Zeile verarbeiten, wie kann ich es umschreiben ??

+2

Zunächst sollten Sie lesen [Warum wird iostream :: eof in einem Loop-Zustand als falsch angesehen?] (Http://stackoverflow.com/questions/5605125/why-isiostreamof-inside-a-loop- Zustand - als falsch angesehen). –

Antwort

1

Für Ihr Problem, verwenden Sie zwei Threads, um die Dateien, eine Datei pro Thread, in zwei Vektoren zu lesen. Dann können Sie die Vektoren beliebig bearbeiten.

Wenn die Datenzeilen in den Eingabedateien nicht verwandt sind, können Sie z. Zwei Threads pro Vektor, jeder Thread behandelt die Hälfte des Vektors. Wenn die Eingabezeilen verwandt sind und Sie diese sequenziell verarbeiten müssen, können Sie jeweils einen Thread für die Vektoren verwenden. Und wenn Sie abwechselnde Zeilen von jedem Vektor verarbeiten müssen, dann nur ein einzelner Thread.

Ein Hinweis zum Lesen der Dateien: Auch wenn Sie Threads für das Lesen verwenden, kann die Leistung tatsächlich langsamer sein. Alles hängt davon ab, wo die Dateien gespeichert sind. Wenn sich die Dateien auf einer einzelnen mechanischen Festplatte befinden, kann sich die Leistung verschlechtern, da die Festplatte vor und zurück springen muss, um die Dateien zu lesen. Wenn sich die Dateien auf zwei separaten Festplatten oder auf einer SSD befinden, sollte die Leistung erhöht werden, indem jeweils ein Thread zum Lesen der Dateien verwendet wird.


Mögliche Implementierung für das Lesen der Dateien

auto reader = [](std::vector<std::string>& v, std::istream& f) 
{ 
    std::string s; 
    v.reserve(5000); // Allocate space for 5000 strings 
    while (std::getline(f, s)) 
     v.push_back(s); 
}; 

std::vector<std::string> english; 
std::vector<std::string> chinese; 

auto future1 = std::async(std::launch::async, reader, std::ref(english), std::ref(fin)); 
auto future2 = std::async(std::launch::async, reader, std::ref(chinese), std::ref(fin2)); 

future1.wait(); 
future2.wait(); 

// Here all lines from fin will be in the vector english 
// and all lines from fin2 will be in the vector chinese 

Die Verarbeitung ich wirklich nicht, dass Sie keinen Code geben kann, nicht einmal Pseudo-Code, als der einzige, der die Daten weiß, wie sollte Verarbeitet werden Sie. Referenzen

:

Auch nicht blind den oben stehenden Code verwenden. Vor allem ist es nicht getestet, es könnte Build-Fehler oder überhaupt nicht funktionieren, sollte aber genug sein, um Ihnen eine Vorstellung davon zu geben, wie es weiter geht. Und bitte versuche zu verstehen, was der Code, den ich gezeigt habe, tatsächlich tut. Lesen Sie die verknüpften Referenzen, Experiment und am wichtigsten Benchmark es, um zu sehen, ob es besser als Ihr aktueller Code ist. Wie ich schon sagte, die Leistung kann variieren oder sogar schlechter sein, je nachdem, welche Art von Festplatten und wo auf den Festplatten die Dateien gespeichert sind.

+0

irgendein Beispielcode ??? @ Joachim Pileborg –

+0

@yihanghwang Ich habe einige Beispielcode für das Lesen der Datei hinzugefügt. Bitte lesen Sie auch den Rest des Textes weiter, kopieren Sie ihn nicht einfach blind. –