代码之家  ›  专栏  ›  技术社区  ›  Kizaru

在不占用太多内存的情况下从.NET文本/闪烁框中读取行?

  •  -1
  • Kizaru  · 技术社区  · 14 年前

    例如,我有一个60+mB的文件。我把它都读到一个闪烁的盒子里,我们称之为科学日志。这个程序使用了大约200mB的内存来实现这个和其他功能。这仍然是可以接受的(并且小于Notepad++打开此文件所使用的内存量)。

    我还有一个闪烁盒,sci\U接头。用户输入一个搜索词,程序在文件中搜索(如果文件长度足够小,则搜索sci\ U日志——这无关紧要,因为它是双向的)以找到regexp.match。当它找到一个匹配项时,它将该行与一个具有先前匹配项的字符串连接起来,并增加一个临时计数变量。当count是100(或者150,或者200,实际上是任何数字)时,我将输出放在sci\u splice中,调用GC.Collect(),然后在接下来的100行中重复(设置count=0,将字符串置零)。

    我现在没有代码,因为我写这个从我的家用笔记本电脑,但问题是它使用了大量的内存。200mB内存的使用量跃升到1gB以上,看不到尽头。这只发生在有大量regexp匹配项的搜索上,所以这是字符串的问题。但问题是,GC不会释放内存吗?还有,为什么会涨这么高?为什么会超过三倍(最坏的情况),这是没有意义的。即使所有的200mB只是登录内存,它所做的只是读取每一行并存储它(最坏的情况下)。

    经过更多的测试,似乎有什么问题闪烁使用大量的内存时,添加线。这些行的初始读取会有一个高达850mB的内存峰值,持续几秒钟。我想我只需要页面输出。

    3 回复  |  直到 14 年前
        1
  •  0
  •   Flory    14 年前

    不要叫GC.Collect。在这种情况下,我不认为这有什么关系,因为我认为这个内存最终会出现在大对象堆(LOH)上。但关键是.Net比你更了解内存管理;别管它。

    我怀疑您是通过使用任务管理器来看待这个问题的,这只是您描述它的方式。您至少需要使用Perfmon。希望你以前没用过 go here and do pretty much what Tess does 上面写着获取内存转储。不确定您是否准备好使用WinDbg,但这可能是您的下一步。

        2
  •  0
  •   Polyfun MicBehrens    14 年前