如何通过使用MigraDoc添加大量行来避免高ram使用?

时间:2016-11-07 17:31:56

标签: c# object ram migradoc

我目前正在开发一个项目,该项目使用>读取大文件或多个文件。数百万行。为此,我使用Streamreader读取每一行。 如果它包含某个字符串,则检查每一行。当条件为真时,我将添加一行。我必须从内存中重现代码,因为我没有代码在我面前:

// in your original code

var Polygon = class{}

// in the console

var Polygon = class {
  // with new stuff
}

因此每次条件为真时,都会添加一个行对象,并且有数百万行这样的行也会有数百万个对象,这会影响我的ram内存并且最有可能“爆炸”。我试过几件事,比如说创建一个包含行对象的列表,并在一定数量后清除它们。但我必须弄清楚它不会清除ram中的对象(list.Clear)。我试图手动调用垃圾收集器,但它对我的性能有负面影响。而现在我正处于一个我不知道如何处理这个问题的地方。它有半个百万行,它的内存接近7GB,我有8GB可用。

我很感激任何建议如何避免高冲压或至少保持冲头低。

我还想补充一点,我是stackoverflow的新手,如果有什么不清楚,请随意指出或指向我:P

1 个答案:

答案 0 :(得分:2)

您通过逐行读取输入文件来做正确的事情。这意味着只需要在RAM中存在每个输入文件的当前行。

但是,对于与标记匹配的每一行,在表格对象中添加一行,你就做错了。那些Table对象存在于RAM中。正如您所发现的那样,尝试创建具有数百万个Row对象的Table对象将耗尽您的RAM。

dotnet集合类可以很好地支持大量集合。但是使用RAM并没有什么神奇之处。

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

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