4

私は VB6 と Win32 API を使用してファイルにデータを書き込んでいます。この機能はデータのエクスポート用であるため、ディスクへの書き込みパフォーマンスが考慮事項の重要な要素です。そのため、 への呼び出しでファイルを開くときにFILE_FLAG_NO_BUFFERINGおよびオプションを使用しています。FILE_FLAG_WRITE_THROUGHCreateFile

FILE_FLAG_NO_BUFFERING独自のバッファーを使用して、ディスクのセクター サイズの倍数でファイルにデータを書き込む必要があります。これは、セクター サイズの正確な倍数でない場合、文字が含まれるデータの最後の部分を除いて、通常は問題ありません。最後のブロックが書き込まれたら、これらの文字ゼロを含めないようにファイル サイズを設定するにはどうすればよいですか?

使用できますSetEndOfFileが、これには、ファイルを閉じて、使用せずに再度開く必要がありますFILE_FLAG_NO_BUFFERING。誰かが話しているのを見NtSetInformationFileたことがありますが、VB6でこれを使用して宣言する方法が見つかりません。SetFileInformationByHandle私がやりたいことを正確に行うことができますが、それは Windows Vista でのみ利用可能です。私のアプリケーションは、以前のバージョンの Windows と互換性がある必要があります。

4

3 に答える 3

4

SetEndOfFile が唯一の方法だと思います。

そして、FILE_FLAG_NO_BUFFERING の有無にかかわらず、コードをベンチに置く必要があるという Mike G. の意見に同意します。最新の OS での Windows ファイルのバッファリングは非常に効果的です。

于 2008-09-29T09:57:24.980 に答える
2

FILE_FLAG_NO_BUFFERINGよくわかりませんが、その設定でFILE_FLAG_WRITE_THROUGH最大のパフォーマンスが得られると確信していますか?

データができるだけ早くディスクにヒットすることは確かですが、そのようなことは実際にはパフォーマンスには役立ちません。クラッシュ。

あなたが説明したようなデータエクスポートルーチンの場合、オペレーティングシステムがデータをバッファリングできるようにすると、書き込みが書き込みごとにファイルに強制的に戻るのではなく、他のディスクアクティビティに合わせてスケジュールされるため、パフォーマンスが向上する可能性があります。 .

これらのオプションを使用せずにコードをベンチマークしてみませんか? 公平なテストにするために、ゼロバイトのパディング ロジックをそのままにしておきます。

これらのオプションをスキップした方が高速であることが判明した場合は、0 パディング ロジックを削除すると、ファイル サイズの問題は自動的に修正されます。

于 2008-09-29T09:39:18.970 に答える
0

1 ギガバイトのファイルの場合、特に多数の小さな I/O を実行する場合は、Windows のバッファリングの方がおそらく高速です。使用可能な RAM よりもはるかに大きなファイルを処理し、大きなブロック I/O を実行している場合、設定したフラグはより優れたスループットを生成する必要があります (大量にスレッド化されたブロックやランダムな大きなブロックの場合、最大 3 倍高速になります)。 I/O)。

于 2011-06-15T17:00:09.803 に答える