6

別のプロセスによって変更(追加) されている間に、大きな CSV ファイルをリアルタイムで解析する必要があります。概して、この時点で最大 20 GB であり、ゆっくりと成長しています。アプリケーションは、データ ストリーム内の特定の異常を検出して報告するだけで済みます。そのためには、小さな状態情報 (O(1)スペース) を保存するだけで済みます。

数秒ごとにファイルの属性 (サイズ) をポーリングし、読み取り専用ストリームを開き、前の位置にシークし、最初に停止した場所で解析を続行することを考えていました。しかし、これはテキスト (CSV) ファイルであるため、何らかの方法で続行する場合は、明らかに改行文字を追跡して、常に行全体を解析できるようにする必要があります。

私が間違っていなければ、これは実装するのにそれほど問題ではないはずですが、これらの問題のいくつかをすでに解決する一般的な方法/ライブラリがあるかどうか知りたいですか?

注: CSV パーサーは必要ありません。その場で変更されているファイルからの行の読み取りを簡素化するライブラリに関する情報が必要です。

4

3 に答える 3

2

私はそれをテストしませんでしたが、FileSystemWatcher を使用して、別のプロセスがいつファイルを変更したかを検出できると思います。Changed イベントでは、以前に保存した位置にシークし、追加コンテンツを読み取ることができます。

于 2012-04-27T12:52:53.320 に答える
1

ここに小さな問題があります:

  • CSV の読み取りと解析には TextReader が必要です
  • TextReaders ではポジショニングが (うまく) 機能しません。

最初に考えたのは、開いたままにすることです。プロデューサーとアナライザーの両方が非排他モードで動作する場合は、ReadLine-until-null、一時停止、ReadLine-until-null などを実行できるはずです。


7 ビット ASCII である必要があり、いくつかの Guid と数字のみ

これにより、ファイルの位置 (pos += line.Length+2) を追跡することが可能になります。で必ず開いてくださいEncoding.ASCII。その後、それをプレーン バイナリ ストリームとして再度開き、最後の位置までシークしてから、StreamReader をそのストリームにアタッチします。

于 2012-04-27T11:53:21.283 に答える
0

解析を開始するたびに、個別のプロセス/スレッドをスピンオフしてみませんか? そうすれば、並行 (オンザフライ) 部分をデータ ソースから離れてデータ シンクに移動できます。すべてのスレッドから結果を収集する方法を理解するには...

ただし、これは、スピンアップするスレッドごとにファイル全体を再読み取りすることを意味します...

csv データ ソースの形式に応じて、2 つのバージョンで diff プログラムを実行し、そこからピックアップすることができます: 既に書き込まれたレコードを変更しますか? それとも、新しいレコードを追加するだけですか? その場合、新しいもの (last-position から current-eof まで) を新しいファイルに分割し、それらをバックグラウンド スレッドで処理することができます。

  • ポーリング スレッドが最後のファイル サイズを記憶する
  • ファイルが大きくなった場合: 最後の位置から最後までシークし、一時ファイルに保存します
  • バックグラウンド スレッドは、作成/変更の順序で、まだ残っている一時ファイルを処理します
于 2012-04-27T12:01:20.077 に答える