Effizentes I/O auf große Dateien
-
Hi,
habe vor so schnell wie möglich in großen Dateien zu schreiben und zu lesen und wollte erstmal generell fragen, ob schon wer damit gute Erfahrungen gemacht hat.
Die Dateien sind ASCII Dateien (Text), in denen ziemlich viele viele Zahlen stehen.
Lesen sollte sicherlich gebuffert geschehen, mit setvbuf kann ich den Buffer kontrollieren, oder? Jedenfalls gibt es eine maximale Buffergröße, oder?
Nun zu meiner Frage, neben hilfreichen generellen Informationen
Welche Lese/Schreibfunktionen sollte ich verwenden/mir näher ansehen?
Danke für zusätzliche Hinweise.
Mat.
-
*Doppeltgemoppelt*
-
Brauchst du unbedingt was Betriebssystemunabhängiges?
-
[quote="SeppSchrot"]Brauchst du unbedingt was Betriebssystemunabhängiges?[/quote]
Nein, es kann auch für Windows bzw. Linux "optimiert" sein.
Wenn es dann schneller ist, als etwas Unabhängiges.edit: Wobei mich natürlich auch eine solche Variante (betriebssystemunabhängig) interessieren würde.
-
Hi,
also für Windows hast du ja bei der Funktion CreateFile
ein paar Hint-Flags, um den OS Hinweise über die vorraussichtliche Verwendung zu geben.Also z.B. FILE_FLAG_SEQUENTIAL_SCAN wenn du sicher bist, das ganze File zu schreiben, ohne den FilePointer manuell zu ändern.
Vermutlich wird hier die Datei auch schön unfragmentiert geschrieben.FILE_FLAG_RANDOM_ACCESS ist das Gegenteil dazu.
Wenn du nichts anderes angibst, werden die Dateien aber eh per Default gepuffert, so daß hier die Einstellungen für den physikalischen Speicher tragender sind.
Außerdem gab es in der Systemsteuerung eine Option "System wird als Server verwendet", die für einen großzügerigen Cache sorgte.
-
SeppSchrot schrieb:
Wenn du nichts anderes angibst, werden die Dateien aber eh per Default gepuffert, so daß hier die Einstellungen für den physikalischen Speicher tragender sind.
um die pufferung zum umgehen gibt es noch FILE_FLAG_WRITE_THROUGH und FILE_FLAG_NO_BUFFERING. sollte man aber alles mit vorsicht geniessen. es könnte sein dass sich genau der gegenteilige effekt einstellt (dass es langsamer arbeitet als vorher)
-
Danke für ein paar Anregungen.
Was mache ich, wenn ich einlesen mag? Also ohne createFile arbeite?
Und, mit welchen Funktionen lese/schreibe ich dann?
-
Hast du denn gar keine Windows SDK-Doku?
Die brauchst du unbedingt, wenn du einigermaßen was an Leistung aus dem Betriebsystem rausholen willst.Hier mal ein Online Link:
http://msdn.microsoft.com/library/en-us/fileio/base/storage_start_page.aspDateien öffnen machst du auch über CreateFile.
Und lesen dann mit ReadFile.
-
Also,
klar kann ich in der Windows Doku lesen, aber wenn ich weiß, was genau ich lesen soll, macht sich das besser.
So z.B. hätte ich Dateien immer über fopen geöffnet. Nun hätte ich gedacht, dass man mir sagt, dass z.B. createFile da besser ist, weil ...
Sorry, falls meine Fragen zu "unbelesen" daherkommen.
-
Matrim schrieb:
So z.B. hätte ich Dateien immer über fopen geöffnet. Nun hätte ich gedacht, dass man mir sagt, dass z.B. createFile da besser ist, weil ...
...fopen() sowieso CreateFile() aufruft.
vielleicht ist das noch interessant für dich: http://www.sysinternals.com/ntw2k/info/comport.shtml
-
Probier es einfach mal ganz simpel mit fopen und fscanf oder fgets oder was du halt verwenden willst. Du wirst überrascht sein, wie schnell das ist.
-
Ringding schrieb:
Probier es einfach mal ganz simpel mit fopen und fscanf oder fgets oder was du halt verwenden willst. Du wirst überrascht sein, wie schnell das ist.
Lieber fread()
Aber oft ist es auch sinnvoll die ganze Datei in den Speicher zu mappen (CreateFileMapping/mmap) sowas kann sau schnell sein.
Aber klar, ich würde auch erst die Standard Sachen testen, denn wenn die schnell genug sind, spart man sich ärger.
-
Das Problem mit fread() und Mappen ist, dass man dann nicht mehr die praktischen Funktionen zum Einlesen von Zeilen verwenden kann. Die muss man sich dann selber zusammenschustern.
-
Ringding schrieb:
Das Problem mit fread() und Mappen ist, dass man dann nicht mehr die praktischen Funktionen zum Einlesen von Zeilen verwenden kann. Die muss man sich dann selber zusammenschustern.
Ob man es selber macht, oder die C Library ist hierbei Performance mäßig egal.
Aber mit fread() kann man effizienter einlesen, was oft ausschlaggebend ist.
und scanf lassen wir mal aussen vor, denn das ist echt lahm.aber OK, fgets() kann durchaus eine gute wahl sein.
-
Shade Of Mine schrieb:
Ob man es selber macht, oder die C Library ist hierbei Performance mäßig egal.
Ja, aber es ist mehr Arbeit...