2

私たちは、コストのかかる実験からテキスト/csv のようなデータを長期間 (~数日) にわたって取得するため、ファイルの破損は何としてでも回避する必要があります。

最近、実験の進行中に XP の Explorer からファイルがコピーされ、おそらく複数のアクセス競合が原因で、データが部分的に失われました。

そのような損失を回避するための良いテクニックは何ですか? - Windows XP システムで Delphi を使用しています。

私たちが思いついたいくつかのアイデアを以下に示します。コメントやご意見をお待ちしております。

4

8 に答える 8

9

データベースをセカンダリ データ ストレージ メカニズムとして使用し、アトミック トランザクション メカニズムを利用する

于 2008-11-15T16:20:31.107 に答える
6

大きなファイルを 1 日ごとに 1 つずつ別々のファイルに分割するのはどうでしょうか。

于 2008-11-15T16:33:51.050 に答える
1

これらのマシンがネットワーク上にある場合: ログ データを含む HTTP ポストを Web サーバーに送信します。(UDP パケットの送信はさらに簡単です)。

古いデータのみをコピーするようにしてください。ファイル名に 1 時間単位のタイムスタンプがある場合は、1 時間より古いデータを安全にコピーできます。

于 2008-11-16T14:43:57.837 に答える
0

あなたが探しているのは、次のフラグを備えたWin32CreateFileAPIだと思います。

FILE_FLAG_WRITE_THROUGH:書き込み操作は中間キャッシュを経由せず、ディスクに直接送信されます。

FILE_FLAG_NO_BUFFERING:ファイルまたはデバイスは、データの読み取りと書き込みのためのシステムキャッシュなしで開かれています。このフラグは、ハードディスクのキャッシュやメモリマップトファイルには影響しません。FILE_FLAG_NO_BUFFERINGフラグを使用してCreateFileで開かれたファイルを正常に処理するには、厳密な要件があります。詳細については、ファイルのバッファリングを参照してください。

于 2008-11-16T09:03:57.713 に答える
0

各実験では、「work」ファイルと「done」ファイルがよく使用されます。作業ファイルを排他的に開き、ネットワーク上の場所にファイルをコピーします。受信側のマシンのアプリケーションは、そのファイルをデータベースにフィードします。エクスプローラーが作業ファイルを移動またはコピーしようとすると、「アクセスが拒否されました」というエラーが表示されます。

「作業」ファイルは、特定の期間 (たとえば、6/12/24 時間など) が経過すると「完了」になります。したがって、別の作業ファイルを作成し(名前にはタイムスタンプが含まれている必要があります)、ネットワークを介して「完了」を送信します(または、人間がそれを行うことができます。テキストを正しく理解している場合、実際に何をしているのか)。

使用中にファイルをコピーすると、破損していることが要求されます。

于 2008-11-17T18:09:24.257 に答える
0

書き込みが失敗した場合は、後で書き込むために結果をキャッシュします。そのため、ファイルが外部で開かれた場合でも、データは内部に保存されるか、ディスクに保存される可能性があります

于 2008-11-15T16:20:12.077 に答える
-1

あいまいなディレクトリのバッファ ファイルにデータを書き込み、そのデータを「パブリック」データ ファイルに定期的に (たとえば 10 ポイントごとに) コピーすることで、書き込みを減らし、バックアップも提供します。

于 2008-11-15T16:19:27.990 に答える
-1

データ ポイントを個別に書き込みます。つまり、データ ポイントの書き込みごとにファイル ハンドルを開いたり閉じたりします。これにより、データ ポイント間の時間が短い場合、ファイルへのアクセス時間が短縮されます。

于 2008-11-15T16:19:51.530 に答える