2

私の仕事は、データの小さな部分をファイルに頻繁に確実に書き込むことです。これはある種のロギング システムであり、データをディスクに保存する際の安全性と速度を保証する必要があります。頻繁に呼び出される Flush() 関数にブレーキがかかることがわかりました。それで、私はそれを取り除くことにしました。

データのバッファリングとキャッシュを禁止するフラグを使用しました (osNoBuffer と writeThrough)。この後、私が理解しているように、flush() を使用せずにファイル I/O 操作 (ファイルへのデータの書き込み) を実行できましたか? もう一問。データがキャッシュやバッファリングなしで確実にディスクに書き込まれることをどのように理解できますか? それは私が望むことを行うための正しい方法ですか、それとも頻繁なファイル書き込み操作を高速化する別の方法でしょうか??

4

1 に答える 1

3

flush()探している保証を確立するため、非常に時間がかかります。ファイルは通常ディスクに書き込まれ、(おそらく) さびたディスクが回転しています。ファイルはこれらのディスクの表面に物理的に散らばっており、読み取り/書き込みヘッドを適切な場所に移動するのに数ミリ秒かかります。1 秒あたり 50 回のフラッシュは、フラッシュあたり平均 20 ミリ秒であることを意味します。これは、ディスクの機械的な処理能力に近い値です。

フラッシュを使用しないと、書き込みが結合されるため、複数の書き込みで必要な読み取り/書き込みヘッドの移動は 1 回だけです。特定のフラグを調べなくても、データが一時的に危険にさらされていることを意味するに違いありません。

ソフトウェアだけでは、データが本当にディスクに書き込まれているかどうかを知ることはできません。これは、Sun が ZFS ファイル システムを開発する際に行った調査によってわかっています。安価で低速なディスクはフラッシュについて嘘をつき、データが実際にフラッシュされる前に戻ることが判明しました。これを保証するには、サーバー グレードのディスクが必要です。

SSD は、この分野で非常に優れたパフォーマンスを発揮します。書き込みヘッドを物理的に移動する必要はありません。したがって、彼らがフラッシュについて嘘をつくインセンティブは少なくなります。

于 2010-10-12T07:56:31.907 に答える