1

私のプログラムでは、2 つのファイルを書き込み用に開いたままにします。1 つはデータのチャンクを含むコンテンツ ファイルで、もう 1 つはデータのチャンクがこれまでに書き込まれたマップを含むインデックス ファイルです。

データファイル内のブロックがマップファイル内の対応するブロックの前に(自然に)書き込まれなければならないという唯一の制約付きで、可能な限りパフォーマンスを上げて両方をディスクにフラッシュしたいと思います。

問題は、遅延とスループットの両方の理由から、IE が fsync を実行するのをブロックすることを避けたいということです。

何か案は?

4

1 に答える 1

1

単一の実行パスでこれを簡単に実行できるとは思いません。ディスクへの書き込みを保証するには fsync が必要です。これは書き込みを待つ必要があります。

書き込みタスクを別のスレッドまたはプロセスに委譲することで、これを行うことは可能だと思います (ただし、簡単ではありません)。既存のプログラムでデータを生成し、適切と思われる方法を使用して 2 番目のスレッド/プロセスに「書き込み」ます。これはノンブロッキングにすることができます。2 番目のスレッドは、新しいデータをコンテンツ ファイルに書き込み、次に fsync に書き込み、次にインデックス ファイルに書き込み、新しいデータを再度チェックします。重要な設計上の決定事項は、2 つの実行パスを分離する方法、それらの間の通信方法、およびライトバックをメイン プログラムに報告する必要があるかどうかに関連しています。これにはまだレイテンシーとスループットの問題がある可能性がありますが、それはインデックス ファイルとコンテンツ ファイルを同期させることを選択した場合のコストの一部です。少なくとも、ディスクで待機している間に作業を完了できる可能性があります。

これが適切にカプセル化されているかどうかを調べて、トランザクション データベースのソースで役立つかどうかを確認する価値があります。コンテンツ ファイルのファイル システムをマウントするときに、同期オプションを調査することもできます。

于 2010-05-06T08:22:15.607 に答える