2010-12-01 69 views
3

我正在C#中构建一个windows窗体应用程序,它从数百个文件读取并创建一个对象层次结构。特别是:我有严重的内存泄漏问题吗?

DEBUG[14]: Imported 129 system/s, 6450 query/s, 6284293 document/s. 

总和是我创建的对象的总数。对象很简单,只是一些int/string属性和强类型列表里面。

问题:正常,我的应用程序正在消耗大约700MB的内存(在调试模式下)?我该如何减少内存使用量?

编辑:这就是为什么我有6284293个对象,如果你只是好奇。想象一下,一个叫做“系统”的搜索引擎。一个系统里面有更多的查询。

public class System 
{ 
    public List<Query> Queries; 
} 

每个查询对象都是指“主题”;这是主要论点(例如,搜索“意大利周末”)。据哈检索文档的列表内:

public class Query 
{ 
    public Topic Topic; // Maintain only a reference to the topic 
    public List<RetrievedDocument> RetrievedDocuments; 
    public System System; // Maintain only a reference to the system 
} 

每个检索到的文档具有得分和排名,并有主题文档的引用:

public class RetrievedDocument 
{ 
    public string Id; 
    public int Rank; 
    public double Score; 
    public Document Document; 
} 

每个主题都有内部的文档的集合,可以是相关的或不相关的,并且它的父主题的引用:

public class Topic 
{ 
    public int Id; 
    public List<Document> Documents; 
    public List<Document> RelevantDocuments 
    { 
    get {return Documents.Where(d => d.IsRelevant());} 
    } 
} 

public class Document 
{ 
    public string Id; 
    public bool IsRelevant; 
    public Topic Topic; // Maintain only a reference to the topic 
} 

有129个系统中,50周主要的主题(129 * 50 = 6450查询对象),每个查询具有一个diff检索到的文件数量达到6284293件。我需要这个层次来做一些计算(平均精度,主题易用性,系统平均精度,相关性)。这是TREC如何工作...

+0

这听起来相当合理,尺寸明智。 – AHungerArtist 2010-12-01 18:24:58

+0

`6284293文档是否意味着您有6284293个对象? – Gabe 2010-12-01 18:25:29

+0

@Gabe:是的,这个数字是所有文件导入的总行数(约130个txt文件),并且对于每一行创建一个类型为“Document”的对象... – gremo 2010-12-01 19:02:30

回答

3

如果您正在阅读6284293文档并且在对象层次结构中持有这些文档,那么您的应用程序显然会使用相当数量的内存。由于我们不知道这些对象的大小,因此很难说您使用的是否比预期的要多。

此外,请记住,CLR代表您的应用程序分配和释放内存。所以即使您的应用程序已经释放内存,这可能不会立即反映在进程的内存使用情况上。如果应用程序没有泄漏,则此内存将在某个时间点被回收,但您不应期望看到托管内存使用情况立即反映在进程内存使用情况中,因为CLR可能会保留内存以减少分配/释放数量。

0

去拿scitech profiler(与两周免费试用),并找出。

小心空列表,它们每个需要40个字节。

0

很难说这是怎么回事不知道更多关于你的代码,但这里的一些想法和建议:

  • 请务必关闭文件完成从中读

  • 确认后您不保留对没有使用的对象 的引用

  • 查看您正在使用的数据结构。有时候,有一个更 内存效率的方式来安排你的 数据

  • 看看你的数据类型,你在的地方使用long或double其中 字节就足够了?

  • 每个程序将在调试模式下使用更多的内存比未调试模式, 但差别应该是 顺序兆字节的单个或10年代, 不是几百上。您可以使用任务 管理器来检查您在调试模式之外使用了多少内存 ?