如何通过在MigraDoc中添加大量行来避免高内存使用率?

问题描述:

我目前正在研究一个读取大型文件或者多个文件的项目,这些文件需要>数百万行。为此,我使用Streamreader来读取每一行。 检查每一行是否包含某个字符串。当条件成立时,我会添加一行。我要重现内存中的代码,因为我没有在我面前代码:如何通过在MigraDoc中添加大量行来避免高内存使用率?

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的可用空间。

我将不胜感激任何建议,我可以如何避免高内存或至少保持公羊低。

我也想补充一点,我在新的计算器如果有什么不清楚随时指出来或点对我道:通过阅读你的输入文件P

你做正确的事从流线逐行。这意味着只有每个输入文件的当前行需要存在于RAM中。

但是,你做错了一件事,就是将每行放入Table对象中,以匹配标记。那些表对象居住在RAM中。尝试使用数百万个Row对象创建Table对象将会耗尽RAM,就像您发现的那样。

dotnet集合类在支持大量集合方面做得很好。但是使用RAM没有任何魔力。

您需要找出一种方法来限制Table对象中Row对象的数量。你可以跟踪行数,当它达到一定数量(谁知道有多大?10K?100K?)将表写入磁盘并创建一个新的?

此外,似乎Migradoc生成PDF文件。一百万页的pdf文件是一个有用的对象吗?这似乎不太可能。对于RTF文件也是如此。

+0

首先感谢您的快速回答。那么我认为它是不可管理的。我可以跟踪行数,我会尽力实施你的建议。你也可以用migradoc生成rtf文件。 – kuzurkurt