我正在C#中构建一个窗体应用程序,它从数百个文件中读取并创建一个对象层次结构。特别是:
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个查询对象),每个查询具有不同数量的检索文档,总共6284293个。我需要这个层次结构来进行一些计算(平均精度,主题简易性,系统平均精度,相关性)。这就是TREC的工作原理......
答案 0 :(得分:3)
如果您正在阅读6284293文档并在对象层次结构中保留这些文档,那么显然您的应用程序将使用相当数量的内存。鉴于我们不知道这些物体的大小,很难说你的使用是否超出预期。
另外,请记住CLR代表您的应用程序分配和释放内存。因此,即使您的应用程序已释放内存,也可能不会立即反映在进程的内存使用情况上。如果应用程序没有泄漏,则会在某些时候回收此内存,但您不应期望在进程内存使用中立即反映托管内存使用情况,因为CLR可能会保留内存以减少分配/释放的数量。
答案 1 :(得分:0)
去scitech profiler(两周免费试用)并找出答案。
注意空列表,它们各占40个字节。
答案 2 :(得分:0)
如果不了解更多关于代码的信息,很难说清楚发生了什么,但这里有一些想法和建议:
确保在完成阅读后关闭文件
确保您没有维护对no对象的引用 更长时间的使用
查看您正在使用的数据结构。有时,还有更多 以记忆效率的方式安排你的 数据
查看您的数据类型,您使用的是Long还是Double 字节就够了吗?
每个程序在调试模式下都会使用比非调试模式更多的内存, 但差异应该在 单个或10兆字节的顺序, 不是几百个。你能用任务吗? 经理检查内存多少 你在调试模式之外使用?