2017-05-16 2 views
-4

Ich muss Zeile für Zeile in großen TXT-Dateien (1 GB) lesen und fgets() dazu verwenden. Ich führe eine leere While-Schleife und die Ausführung dauert extrem lange (30 Minuten) mit 99% CPU-Auslastung.CPU-Auslastung 99% beim Lesen großer txt-Datei mit fgets() C++

int buffer_size = 30; Zeichenpuffer [Puffergröße];

while (fgets(buffer, buffer_size, traceFile1) != NULL) 
{ 
} 

Ich habe etwas lesen und anscheinend die Gemeinkosten im Zusammenhang mit Textanalyse verursacht dies. Die Frage ist also, gibt es eine Möglichkeit, in einer TXT-Datei zu lesen, während dies vermieden wird? Ich lese in Traces für einen Netzwerk-Simulator, so dass jede Zeile normalerweise | Injection_cycle-Quellziel |

Ich habe für eine Weile suchen, also wenn jemand eine intelligente Antwort auf diese Frage hat, würde ich absolut begeistert sein :)

+0

Willkommen bei Stack Overflow. Bitte nehmen Sie sich die Zeit, [The Tour] (http://stackoverflow.com/tour) zu lesen und beziehen Sie sich auf das Material aus der [Hilfe] (http://stackoverflow.com/help/asking), was und wie Sie können fragen Sie hier. –

+0

"Ich habe etwas gelesen und anscheinend verursachen die Gemeinkosten, die mit dem Parsen von Text zusammenhängen, das." - In dem von Ihnen geposteten Code findet kein Parsing statt. –

+0

Es sollte nicht 30 Minuten dauern, eine 1GB Datei auf diese Weise zu lesen. Etwas ist sehr falsch. (Die kleine Puffergröße hilft nicht, aber das kann nicht das ganze Problem sein.) –

Antwort

0
1GB = 1024MB= 1048576 KB = 1073741824 B 
30 min = 1800 seconds 

Sie sind also im Grunde über 595k/s Vergleiche zu vergleichen (Prüfen, ob die aktuelles Zeichen ist '\ n' oder '\ t' oder eof) und ungefähr die gleiche Menge an Speicherzuweisungen. Nicht nur das, sondern auch eine Sprungoperation, da Sie eine Schleifenanweisung haben.

Obwohl es nicht zu schnell ist, ist es auch nicht zu langsam, ich habe ein paar "kritische Fälle" gesehen, die das Computerspeichersystem nicht richtig benutzen können, wie skaliert das Ergebnis für verschiedene Größen?

Ich denke, ich bin eher aus dem Grund, aber ich hoffe, es hilft

+0

Vielen Dank für Ihre Antwort! Ich habe die Dateigröße variiert, aber selbst für 1MB bekomme ich dieses Nutzungsverhalten und es dauert furchtbar lange:/Kann immer noch nicht herausfinden, was es ist ... – Quavo

+0

könnte es sein, dass deine Puffergröße zu klein ist? von dem, was ich in http://www.cplusplus.com/reference/cstdio/fgets/ gelesen habe, wird es den Puffer nur mit 30 Zeichen füllen oder bis er ein neues Zeilenzeichen findet. es erkennt nur die neue Zeile Zeichen oder eof, so dass das der Grund sein könnte, in Ihrem durchschnittlichen Buch ist es selten, Zeichen so klein zu finden, haben Sie versucht, es auf 100-200 zu erhöhen? –

Verwandte Themen