4

私は、2GB から 100GB の範囲の非常に大きなテキスト ファイルをプログラムに読み込む方法を作成することに挑戦しました。

これまでのアイデアは、たとえば 1,000 行のテキストをメソッドに読み込むことでした。

現時点では、ストリーム リーダーを使用してファイルを 1 行ずつ読み取り、その行で見つかったデータの必要な領域を処理するようにプログラムがセットアップされています。

using (StreamReader reader = new StreamReader("FileName"))
{
    string nextline = reader.ReadLine();
    string textline = null;

    while (nextline != null)
    {
        textline = nextline;
        Row rw = new Row();
        var property = from matchID in xmldata
                       from matching in matchID.MyProperty
                       where matchID.ID == textline.Substring(0, 3).TrimEnd()
                       select matching;

        string IDD = textline.Substring(0, 3).TrimEnd();

        foreach (var field in property)
        {
            Field fl = new Field();

            fl.Name = field.name;
            fl.Data = textline.Substring(field.startByte - 1, field.length).TrimEnd();
            fl.Order = order;
            fl.Show = true;

            order++;

            rw.ID = IDD;
            rw.AddField(fl);
        }
        rec.Rows.Add(rw);
        nextline = reader.ReadLine();

        if ((nextline == null) || (NewPack == nextline.Substring(0, 3).TrimEnd()))
        {
            d.ID = IDs.ToString();
            d.Records.Add(rec);
            IDs++;
            DataList.Add(d.ID, d);
            rec = new Record();

            d = new Data();
        }
    }
}

プログラムはさらに進み、クラスにデータを取り込みます。(残りは投稿しないことにしました)

プログラムが非常に大きなファイルを表示すると、メモリ例外エラーが発生することがわかっています。

それが私の現在の問題であり、これまでのところ、多くの人がストリームリーダーとreader.readtoendの使用に答えるだけでいくつかのアプローチをグーグルで調べてきました。これらのメモリエラーが発生するため、readtoendが機能しないことを知っています。

最後に、一定量の行を読み取り、次の量の行を処理する前に呼び出しを待機するメソッドを作成する方法として、非同期を検討しています。

これは、非同期を理解するのに苦労している私の問題につながります。学習に役立つ資料が見つからないようで、ここの誰かが非同期を理解する方法で私を助けてくれることを望んでいました.

もちろん、誰かがこの問題を解決するためのより良い方法を知っているなら、私はすべて耳にします.

EDIT混乱を避けるために残りのコードを追加しました。

4

1 に答える 1