【发布时间】:2010-11-28 11:36:39
【问题描述】:
我编写了一个程序,它分析项目的源代码并根据代码报告各种问题和指标。
为了分析源代码,我加载了项目目录结构中存在的代码文件并从内存中分析代码。代码在传递给其他方法进行进一步分析之前会经过大量处理。
代码在处理时被传递给几个类。
前几天,我在我小组的一个较大项目上运行它,但由于加载到内存中的源代码过多,我的程序崩溃了。目前这是一个极端情况,但我希望将来能够处理这个问题。
避免内存问题的最佳方法是什么?
我正在考虑加载代码,对文件进行初始处理,然后将结果序列化到磁盘,这样当我需要再次访问它们时,我就不必经过处理原始数据的过程再次编码。这有意义吗?还是序列化/反序列化比再次处理代码更昂贵?
我希望在解决此问题的同时保持合理的性能水平。大多数时候,源代码会毫无问题地放入内存中,那么当我内存不足时,有没有办法只“分页”我的信息?有没有办法判断我的应用程序何时内存不足?
更新: 问题不在于单个文件填满内存,而是内存中的所有文件一次填满内存。我目前的想法是在处理它们时关闭磁盘驱动器
【问题讨论】:
-
我会采用序列化方法。但是看看 FindBug 的源代码。他们做了类似的事情,也许他们已经解决了这个问题:findbugs.sourceforge.net/downloads.html
-
内存大小与磁盘文件大小的比例是多少?
-
您提到在类之间传递字符串。根据您处理字符串的方式,可能正在制作一些副本,因此您使用的内存超出了您的需要。我不确切知道 C# 如何处理传递字符串,但如果它复制它们,那么这可能是问题。
标签: c# memory-management