Die Leistung von fwrite () liegt weit unter der Festplattenkapazität
Ich habe ein dynamisch zugewiesenes Array von astruct
mit 17 Millionen Elementen. Um es auf die Festplatte zu speichern, schreibe ich
fwrite(StructList, sizeof(Struct), NumStructs, FilePointer)
In einem späteren Schritt las ich es mit einem Äquivalentfread
Anweisung, das heißt, mitsizeof(Struct)
und eine Zählung vonNumStructs
. Ich erwarte, dass die resultierende Datei ungefähr 3,5 GB groß sein wird (dies ist alles x64).
Ist es stattdessen möglich zu bestehensizeof(Struct) * NumStructs
wie die Größe und1
als die Zählung, um dies zu beschleunigen? Ich kratzte mir am Kopf, warum der Schreibvorgang möglicherweise dauern könnteProtokoll auf einem schnellen Computer mit 32 GB RAM (viel Schreib-Cache). Ich habe selbstgebraute Benchmarks durchgeführt und der Cache ist aggressiv genug, dass 400 MB / s für die ersten 800 MB bis 1 GB typisch sind. PerfMon zeigt, dass es während des Schreibvorgangs 100% eines Kerns verbraucht.
Ich habe die Frage gesehenHier Ich frage also, ob es in fwrite eine Schleife gibt, die "ausgetrickst" werden kann, um schneller zu werden, indem man sie dazu auffordert, 1 Element der Größe n * s im Gegensatz zu n Elementen der Größe s zu schreiben.
BEARBEITEN
Ich habe dies zweimal im Release-Modus ausgeführt und beide Male das Warten aufgegeben. Dann habe ich es im Debug-Modus ausgeführtfwrite
Operationen dauern viel länger. Die genaue Größe der zu schreibenden Daten beträgt 4.368.892.928 Bytes. In allen drei Fällen zeigt PerfMon im Abstand von etwa 30 Sekunden zwei Bursts von Festplattenschreibaktivitäten an, wonach die CPU auf 100% eines Kerns wechselt. Die Datei ist zu diesem Zeitpunkt 73.924.608 Bytes. Ich habe Haltepunkte auf beiden Seiten desfwrite
Also weiß ich, dass es dort sitzt. Es scheint sicher, dass etwas feststeckt, aber ich werde es über Nacht laufen lassen und sehen.
BEARBEITEN
Habe dies über Nacht und es hing definitiv infwrite
, die Datei hat 70 MB nicht überschritten.