0

カスタム ログ ファイルを分析する方法を探しています。

現在、LINQ と C#.NET を使用して実装しています。最大 500MB のサイズのログ ファイルでのみ機能します。

ログ ファイルの各行は、次のようなオブジェクトになります。

public class Metrics
{
    public DateTime Date { get; set; }
    public string Metrics1 { get; set; }
    public string Metrics2 { get; set; }
                :
                :
    public string Metrics9 { get; set; }
}

List<Metrics> MetricsList = new List<Metrics>();

MetricsList が入力されます。便利な分析を提供するために、さまざまな LINQ クエリが MetricsList で実行されます。Metrics オブジェクトには 300 バイトが必要であることが確認されています。500MB のログ ファイルに約 400 万行あるため、MetricsList だけで 1GB 以上のプログラム メモリを消費します。

私の要件は、4 GB のメモリを消費するように見える最大 2 GB のサイズのファイルを解析および分析することです。

Windows、Microsoft Technologies、およびオープン ソース ライブラリを使用した、より優れたアプローチまたは代替案。

4

2 に答える 2

1

通常、そのようなファイルをメモリに保存したくはありませんが (もちろん十分な容量がある場合を除きます)、ファイルを解析するときにデータを処理します。単純にメモリを増設して、ソリューションを 64 ビットに設定するだけです...

ただし、それができない場合は、いつでもメモリ使用量を少し最適化できます。.NET は文字列を char[] として格納します。ここで、char は基本的に 2 バイトの short です。Encoding.UTF8.GetBytes を使用して、単に char[] ではなく byte[] として格納するだけで、大量のメモリを簡単に節約できます。

また、各文字列または byte[] は、64 ビット環境で 24 バイト (オブジェクト自体に 16 バイト、ポインターに 8 バイト) を消費します。小さな文字列がたくさんある場合は、合計できます。それらを文字列として保存する代わりに、単一の byte[] を保存してゲッターで解析を行うこともできます。

したがって、私のアドバイスを締めくくるには、メモリを追加購入するか、読み取り/必要に応じてデータを処理することです。

【アップデート+1】

リストを使用していることに気付きました。随時処理する最も簡単な方法は、ファイルを IEnumerable として読み取り、その上で Linq を使用することです。最初にリストに入れないでください。例えば:

public IEnumerable<Metric> ReadFile()
{
    string s;
    while ((s=myFileReader.ReadLine())!=null)
    {
        yield return Parse(s);
    }
}

int someAnalysis = ReadFile().Sum((a)=>(a.Metric1.Length)); // or whatever you do

【アップデート+2】

ああ、私はあなたのための別のトリックを持っています. ファイルの IO は比較的悪いため、ファイルの読み取りはパフォーマンスに負担がかかる可能性があります。したがって、上記の IEnumeration トリックを使用する代わりに、圧縮ストリームを使用してすべてのデータをメモリに格納し、ファイルの代わりに処理中にそれを使用することもできます。

私がこの奇妙な解決策について真剣に考えているかどうか疑問に思っている人のために: これは、検索テクノロジとデータベースを構築するときによく使用される手法です。これは、(高速) メモリが多いほど、ディスク IO が少ない (遅い) ことを意味するためです。さらに、ログ ファイルはおそらく非常にうまく圧縮されます。

そのため、メモリストリームの上にファイル && flatestream を読み込みます。次に、上で説明した方法で Linq を読み取ります (ここでも、メモリストリームの上に flatestream があります)。

于 2013-01-18T13:06:21.540 に答える
1

SQLite を使用して同様のタスクを実行しました。System.Data.SQLite NuGet をインストールすると (オプション: Dapper NuGet も非常に効率的なマイクロ ORM として使用しました)、クエリを実行してレポートを生成するための非常に優れたツールが手に入ります。気に入らないかもしれない唯一のことは、LINQ の代わりに SQL を書かなければならないことです (ただし、SQLite 用の LINQ もありますが、私は使用していません)。

このようにして、メモリ消費もなくなります。

于 2013-01-18T13:15:33.100 に答える