Momentan arbeite ich an einem kleinen Programm, das große Dateien liest und sortiert. Nach einigem Benchmarking stolperte ich über ein seltsames Performance-Problem. Wenn die Eingabedatei zu groß wurde, dauerte das Schreiben der Ausgabedatei länger als die tatsächliche Sortierung. Also ging ich tiefer in den Code und erkannte schließlich, dass die fputs-Funktion das Problem sein könnte. Also habe ich dieses kleine Benchmarking-Programm geschrieben.
%Vor%Wenn Sie das Programm ausführen, können Sie nach ungefähr 14 bis 15 Millionen Zeilen einen klaren Leistungsabfall sehen, was etwa 2,5 GB an Daten entspricht. Das Schreiben dauert etwa 3 mal so lange wie zuvor. Der Grenzwert von 2 GB deutet auf ein 64-Bit-Problem hin, aber ich habe im Web nichts darüber gefunden. Ich habe auch getestet, ob es einen Unterschied zwischen Binär- und Zeichenmodus gibt (z.B. "wb" und "w"), aber es gibt keinen. Ich habe auch versucht, die Dateigröße vorzubelegen (um Dateifragmentierung zu vermeiden), indem ich nach dem erwarteten Ende suchte und einen Zerobyte schrieb, aber das hatte auch wenig bis keinen Effekt.
Ich betreibe eine Windows 7 64bit Maschine, aber ich habe sie auch auf einer Windows Server 2008 64bit R1 Maschine getestet. Derzeit teste ich ein NTFS-Dateisystem mit mehr als 200 GB freiem Speicherplatz. Mein System hat 16 GB RAM, also sollte das auch kein Problem sein. Das Testprogramm verwendet nur ca. 700 KB. Die Seitenfehler, die ich früher vermutet habe, sind ebenfalls sehr niedrig (~ 400 Seitenfehler während der gesamten Laufzeit).
Ich weiß, dass die fwrite () - Funktion für so große Daten die Aufgabe besser erfüllen würde, aber im Moment bin ich daran interessiert, ob es eine andere Problemumgehung gibt und warum dies geschieht. Jede Hilfe würde sehr geschätzt werden.
Der Hauptgrund für all das ist ein Windows-Festplatten-Cache. Dann frisst Ihr Programm den gesamten RAM dafür, dann beginnt das Swapping und damit die Verlangsamung. Um diese zu bekämpfen, müssen Sie:
1) Öffnen Sie die Datei im Festschreibungsmodus mit c
flag:
2) Schreiben Sie den Puffer regelmäßig auf die Festplatte mit flush
function:
Auf diese Weise verwenden Sie eine angemessene Menge an Festplatten-Cache. Die Geschwindigkeit wird grundsätzlich durch die Geschwindigkeit Ihrer Festplatte begrenzt.
Tags und Links c 64bit windows file-io large-files