Frage

Ich verwende VB6 und die Win32-API-Daten in eine Datei zu schreiben, ist diese Funktionalität für den Export von Daten, also die Schreibleistung auf die Platte der entscheidende Faktor in meinen Überlegungen ist. Als solche ich bin mit dem FILE_FLAG_NO_BUFFERING und FILE_FLAG_WRITE_THROUGH Optionen, wenn Sie die Datei mit einem Aufruf Öffnen CreateFile.

FILE_FLAG_NO_BUFFERING erfordert, dass ich meine eigenen Puffer verwenden und Schreiben von Daten in die Datei ein Vielfaches der Sektorgröße der Platte, ist das kein Problem im Allgemeinen ist, abgesehen von dem letzten Teil von Daten, die, wenn sie nicht genau ein Vielfaches des Sektors Größe wird Zeichen Nullen Polsterung aus der Datei enthält, wie kann ich die Dateigröße gesetzt, nachdem der letzte Block enthält, um nicht diesen Charakter Null geschrieben?

kann ich SetEndOfFile aber dies erfordert mir die Datei zu schließen und wieder öffnen, ohne FILE_FLAG_NO_BUFFERING zu verwenden. Ich habe jemanden reden aber über NtSetInformationFile gesehen kann ich nicht finden, wie dies in VB6 verwenden und zu erklären. SetFileInformationByHandle kann genau das tun, was ich will, aber es ist nur in Windows Vista ist, meine Anwendung muss mit früheren Versionen von Windows kompatibel ist.

War es hilfreich?

Lösung

Ich bin nicht sicher, aber sind Sie sicher, dass Einstellung FILE_FLAG_NO_BUFFERING und FILE_FLAG_WRITE_THROUGH geben Sie eine maximale Leistung?

Sie werden sicherlich in Ihren Daten führen die Scheibe so schnell wie möglich treffen, aber diese Art der Sache nicht wirklich Leistung helfen - es hilft nur Zuverlässigkeit für Dinge wie Journaldateien, die Sie so vollständig wie möglich sein wollen in die bei einem Crash.

Für eine Daten-Export-Routine, wie Sie beschreiben, so dass das Betriebssystem die Daten puffern, wird wahrscheinlich zu einer besseren Leistung führen, da die Schreibvorgänge werden im Einklang mit anderen Plattenaktivität geplant werden, anstatt zwingt die Platte zu springen zurück Ihre Datei alle schreiben.

Warum nicht Sie Benchmark-Code ohne diese Optionen? Lassen Sie in der 0-Byte-padding-Logik, um es ein fairer Test zu machen.

Wenn es sich herausstellt, dass diese Optionen Überspringen schneller ist, dann können Sie die 0-Polster Logik entfernen, und die Dateigröße Problem behebt selbst.

Andere Tipps

Ich glaube, SetEndOfFile ist der einzige Weg.

Und ich mit Mike G. einverstanden, dass Sie sollten Bank Code mit und ohne FILE_FLAG_NO_BUFFERING. Windows-Datei Pufferung auf modernen Betriebssystemen ist verflixt wirksam.

Nun, ich bin begeistert! Windows-Pufferung statt alles selbst zu tun, ist VIEL schneller. Ich habe mit einer 1 GB-Datei zu schreiben, um zu testen, im Durchschnitt 21,146 Sekunden nahm meine eigenen Puffer und die FILE_FLAG_NO_BUFFERING und FILE_FLAG_WRITE_THROUGH Optionen verwenden, ohne diese Einstellungen und mithilfe der Windows die durchschnittliche Zeitpuffer auf 13,53 Sekunden gesunken, das sind mehr als 30% schneller!

Hinweis zur Selbsthilfe: Keine Notwendigkeit, das Rad neu zu erfinden. ; -)

Danke ' Mike G ' für Ihre schnelle und genaue Antwort. Und Dank auch an Sie ' gabr ', keine Notwendigkeit, mit SetEndOfFile zu stören überhaupt jetzt.

Für eine 1-GB-Datei, wird Windows Pufferung in der Tat wahrscheinlich schneller sein, esp. wenn viele kleine IOs tun. Wenn Sie mit Dateien zu tun hat, die als verfügbar RAM viel größer sind, und Großblock-IO tun, die Flags Sie werden wurden Einstellung produzieren müssen einen besseren Durchsatz (bis 3x schneller für stark Gewinde- und / oder statistisch Großblock-IO).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top