0

私はデータ収集を伴うプロジェクトに取り組んでいます。非常に重要な要件の 1 つが次のように説明されています。

  1. 記録の開始時に、ファイルを作成し、そのヘッダーを書き込む必要があります。
  2. データ取得が開始されるとすぐに、アプリケーションは収集したデータを定期的に (通常は 1 秒に 1 回) ファイルに保存し続ける必要があります。
  3. 書き込みは、可能であればアトミックにファイルにデータブロックを追加することから成ります。
  4. エラーが発生した場合 (プログラム エラー、電源障害)、エラーの前の最後の書き込みまでファイルを有効に保つ必要があります。

したがって、スレッドを使用して受信したデータを監視し、このデータ do ファイルを書き込む予定ですが、どの方法が最適かはわかりません (以下のコードは実際のものではありません。感覚をつかむためです)。

最初のオプション: シングル オープン

using (var fs = new FileStream(filename, FileMode.CreateNew, FileAccess.Write))
    fs.Write(headers, 0, headers.Length);

using (var fs = new FileStream(filename, FileMode.Append, FileAccess.Write))
{
    while (acquisitionRunning)
    {
        Thread.Sleep(100);
        if (getNewData(out _someData;))
        {                        
            fs.Write(_someData, 0, _someData.Length);
        }
    }
}

2 番目のオプション: 複数オープン:

using (var fs = new FileStream(filename, FileMode.CreateNew, FileAccess.Write))
    fs.Write(headers, 0, headers.Length);

while (acquisitionRunning)
{
    Thread.Sleep(100);
    if (getNewData(out _someData;))
    { 
        using (var fs = new FileStream(filename, FileMode.Append, FileAccess.Write))
        {                       
            fs.Write(_someData, 0, _someData.Length);
        }
    }
}

アプリケーションはクライアント マシンで動作することが想定されており、他のプロセスによるファイル アクセスは問題になりません。私が最も懸念していることは次のとおりです。

  1. 複数のオープン/クローズ インパクト パフォーマンスを実行します (通常の書き込み間隔は 1 秒に 1 回であることに注意してください)。
  2. 障害が発生した場合 (明示的な電源障害を含む)、ファイルの整合性を安全に保つのに最適なのはどれですか?
  3. このフォームのいずれかが特に良いまたは悪いプラクティスと見なされますか、または目前の問題の詳細に応じていずれかを使用できますか?
4

2 に答える 2

2

停電などの場合にファイルの内容を保存する良い方法は、書き込みごとにファイルストリームをフラッシュすることです。これにより、ストリームに書き込んだコンテンツがすぐにディスクに書き込まれます。

于 2017-09-12T20:51:29.330 に答える
1

あなたが述べたように、他のプロセスはファイルにアクセスしないため、ファイルを開いたままにしても複雑になることはなく、高速になります。ただし、アプリがクラッシュした場合、ロックはファイルに残るため、シナリオに応じてこれを処理する必要がある可能性があることに注意してください。

于 2015-03-05T15:45:21.483 に答える