0

私は、大量のデータをディスクに書き込み、後ではるかに少量のデータを読み戻す必要があるプログラムを開発しています。関連するデータをまとめて「ビン化」する必要があり、それをどう処理するかを理解したら、データをさらに処理できます。基本的にはデータベースのように機能しますが、ディスク上に一時ファイルがあります。一時ファイルの一部は、ディスク上のデータを読み戻した後は気にしないため、かなり頻繁に再利用されるため、ファイルのその部分を再利用できます。シーケンシャル I/O は単に遅すぎるため、I/O 完了ポートを使用してこれを実装しています。

問題は、データを読み取ったときに、すべてが返されないことがあることです。たとえば、読み取りバッファーをゼロに設定し、たとえば 20 バイトの読み取り操作を実行します。対応する完了イベントがトリガーされると、読み取りバッファーの一部またはすべてがディスク上にあるはずのものと一致しませんが、すべては一致しません。ゼロにはなりません。時折、これを検出して 5 秒間スリープさせ、同じ部分をもう一度読んでみると、最初に読んだものと一致することがあります。これは最上位の SSD で行われているため、ディスクにフラッシュするには 5 秒で十分です。ただし、アプリケーションを停止してファイルの内容を確認すると、ディスク上では正しくなっています。以前の書き込みがディスクにフラッシュされておらず、古いデータを読み取ろうとしたかのようです。

その理論をテストするために、セクション全体を読みながら 0xFF を書き込んでみました。このエラーが再び発生したとき、私の読み取りバッファには予想どおり 0xFF が含まれていませんでした。おそらく、私は古いデータを読んでいません。

また、完了イベントから返されたバイト数が ReadFile に渡したバイト数と一致していることも確認しましたが、一致しています。完了イベントまたは ReadFile (ERROR_IO_PENDING 以外) によって返されるエラーはありません。FILE_ATTRIBUTE_NORMAL、FILE_FLAG_OVERLAPPED、および FILE_FLAG_RANDOM_ACCESS を使用して一時ファイルを作成しています。

また、読み取りを試みる前に、ファイルの特定の部分に対するすべての保留中の書き込みが完了するのを待ってみましたが、役に立ちませんでした。Windows がそれをしてくれることを願っていますが、私が読んだどのドキュメントにも記載されていません。

部分的または破損した読み取りのように見える理由について、私は本当に途方に暮れています。私は全力を尽くしているので、この動作を引き起こす可能性のあるアイデアを本当に探しています。

4

1 に答える 1

0

同じファイルの同じ部分への書き込みと読み取りを開始している音から、読み取りが返すデータは、以前に書き込んだと思われるものではない場合があります。

ファイルの同じ領域に対して読み取り要求を発行する前に、データの書き込み完了を待っていると思いますか? そうでない場合、書き込みが完了する前に読み取りが発生している可能性がありますか? 大量のデータが同じディスクに書き込まれると、書き込みの完了が遅くなり始め、書き込みの保留時間が長くなる可能性があります (これが消費するリソースに注意してください!)

個人的には、書き込みが完了するまでデータ ブロックを認識している独自のメモリ キャッシュ レイヤーを含めます。書き込みがまだ完了していない場合は、キャッシュからファイルのこの部分の読み取りを満たすことができます。

于 2013-03-09T14:51:55.357 に答える