我必须创建一个C#程序,它可以很好地读取大文件。
例如,我有一个60+ mB的文件。我把它全部读成了一个闪烁的盒子,让我们称之为sci_log。该程序使用大约200mB的内存和其他功能。这仍然是可以接受的(并且小于Notepad ++打开此文件所使用的内存量)。
我有另一个scintilla盒子,sci_splice。用户输入一个搜索词,程序搜索文件(或sci_log,如果文件长度足够小 - 无论因为它发生两种方式都无关紧要)来查找regexp.match。当找到匹配项时,它会将该行与具有先前匹配项的字符串连接起来,并增加临时计数变量。当count为100(或150或200,任何数字)时,我将输出放在sci_splice中,调用GC.Collect(),然后重复接下来的100行(设置count = 0,使字符串归零)。 / p>
我现在没有关于我的代码,因为我是从家用笔记本电脑上写的,但问题是它使用了大量的内存。 200mB内存使用量突然超过1gB,看不到尽头。这只发生在具有大量正则表达式匹配的搜索中,因此它与字符串有关。但问题是,GC不会释放内存吗?另外,它为什么这么高?它为什么会超过三倍(最糟糕的情况)是没有意义的。即使所有200mB都只是内存中的日志,它所做的只是读取每一行并存储它(最坏的情况下)。
经过一些更多的测试,看起来Scintilla在添加行时使用了大量内存有问题。线路的初始读取具有高达850mB的存储器峰值,持续时间仅为几分之一秒。猜猜我只需要输出页面。
答案 0 :(得分:0)
如果您使用System.String存储匹配的行,我建议您尝试将其替换为System.Text.StringBuilder,看看是否有任何区别。
答案 1 :(得分:0)
不要调用GC.Collect。在这种情况下,我认为这并不重要,因为我认为这个内存最终将会出现在大对象堆(LOH)上。但重点是.Net比你更了解内存管理;别管它了。
我怀疑您正在使用任务管理器来查看它,就像您描述它一样。你需要至少使用Perfmon。预计你没有在go here and do pretty much what Tess does之前使用它来获取内存转储。不确定你已经为WinDbg做好了准备,但这可能是你的下一步。
没有看到代码,几乎无法知道它是怎么回事。问题也可能在Scintilla内部,但我会先检查一下你在做什么。通过运行perfmon,您至少可以获得更多信息,以确定下一步该做什么。
答案 2 :(得分:0)