2016-11-07 4 views
1

私は現在、大容量のファイル、または数百万行以上の複数のファイルを読み込むプロジェクトに取り組んでいます。これを行うために、私はStreamreaderを使って各行を読みます。 すべての行に、特定の文字列が含まれているかどうかがチェックされます。条件が真であれば、行を追加します。私は私の前にコードを持っていないので、私はメモリからコードを再現する必要があります。MigraDocで多量の行を追加してRAM使用量を増やす方法を避けるには?

Table table = new Table(); 
Row row = new Row(); 
Cell cell = new Cell(); 
using(Streamreader sr = new Streamreader(file)) 
{ 
    string str; 
    while((str = sr.ReadLine()) != null) 
    { 
     if(str.Includes("Marker")) 
     { 
      row = table.AddRow(); 
      cell = row.Cells[0] 
      cell = row.Cells[1] // actually I use a counter variable, cause my table has 6 cells consistent. 
     } 
    } 
} 

だから毎回条件が真である、行オブジェクトが追加され、これらのラインの何百万人ともあるでしょう私のラムの記憶に影響を及ぼし、「爆発」する可能性が最も高いのは何百万ものオブジェクトです。私はいくつかのことを試しました。行オブジェクトを含むリストを作成し、特定の番号の後にそれらをクリアします。しかし、私はそれがラム(list.Clear)からオブジェクトをクリアしないことを理解しなければならなかった。私はガベージコレクタを手動で呼び出そうとしましたが、パフォーマンスにマイナスの影響を与えます。そして今、私はこれをどう扱うべきかわかりません。 50万回線で約7GBのRAMに達し、8GBの空き容量があります。

私は高級ラムを避けたり、少なくともラムを低く保つことができます。

私も、私はstackoverflowの上の新たなんだ、何が私にそれアウトやポイントを指し示す気軽に明確ではない場合ことを追加したい:P

答えて

2

あなたの入力ファイルを読み込むことで正しいことをやっていますストリームごとに行ごとに表示されます。つまり、各入力ファイルの現在の行だけがRAMに存在する必要があります。

しかし、マーカに一致する行ごとにテーブルオブジェクトに行を置くと、間違ったことが起こります。これらのテーブルオブジェクトはRAMに格納されます。数百万の行オブジェクトに数百万のテーブルオブジェクトを作成しようとすると、あなたが発見したようにRAMが使い果たされます。

ドットネットコレクションクラスは、膨大なコレクションをサポートするのに適しています。しかし、RAMの使用については魔法はありません。

TableオブジェクトのRowオブジェクトの数を制限する方法を理解する必要があります。あなたは行数を追跡することができますか、それが特定の数に達したら(誰がどのくらい大きな10K〜100Kを知っていますか?)、テーブルをディスクに書き込んで新しいテーブルを作成しますか?

また、MigradocがPDFファイルを生成するようです。百万ページのpdfファイルは有用なオブジェクトですか?それは起こりそうもない。 RTFファイルと同じです。

+0

まずはお返事ありがとうございます。まあ私はそれが管理可能ではないと仮定した。私は行数を追跡することができます、私はあなたの提案を実装しようとします。 migradocでrtf文書を生成することもできます。 – kuzurkurt

関連する問題