Effizentes I/O auf große Dateien



  • 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.asp

    Dateien ö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...


Anmelden zum Antworten