2010-12-01 2 views
3

Я создаю приложение формы Windows на C#, которое читает из сотен файлов и создает иерархию объектов. В частности:У меня серьезная проблема с утечкой памяти?

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

Сумма - это общее количество объектов, которые я создал. Между прочим, объекты действительно простые, только некоторые свойства int/string и строго типизированные списки внутри.

Вопрос: нормально, что мое приложение потребляет около 700 МБ памяти (в режиме отладки)? Что я могу сделать для сокращения использования памяти?

EDIT: вот почему у меня есть 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

Звучит довольно разумно, разумно. – AHungerArtist 2010-12-01 18:24:58

+0

Имеет ли `6284293 документов 'означает, что у вас есть 6284293 объектов? – Gabe 2010-12-01 18:25:29

+0

@Gabe: да, это число - это общие строки всех импортированных файлов (~ 130 txt-файлов), и для каждой строки создается объект типа «Документ» ... – gremo 2010-12-01 19:02:30

ответ

3

Если вы читаете 6284293 документов и проведения на них в иерархии объектов, то очевидно, что ваше приложение, если собираетесь использовать достаточное количество памяти. Трудно сказать, используете ли вы больше, чем можно было ожидать, учитывая, что мы не знаем размер этих объектов.

Кроме того, помните, что среда CLR выделяет и освобождает память от имени вашего приложения. Поэтому, несмотря на то, что ваше приложение выпустило память, это может не сразу отразиться на использовании памяти. Если приложение не протекает, эта память будет восстановлена ​​в какой-то момент, но вы не должны ожидать, что использование управляемой памяти сразу отразится в использовании памяти процесса, так как CLR может удерживаться в памяти, чтобы уменьшить количество распределений/освобождений.

0

Пройдите scitech profiler (с двухнедельной бесплатной пробной версией) и узнайте.

Остерегайтесь пустых списков, они занимают 40 байт каждый.

0

Трудно сказать, что происходит, не зная больше о вашем коде, но вот некоторые идеи и предложения:

  • Убедитесь, что вы закрыть файлы после того, как вы закончите чтение из них

  • Убедитесь вы не поддерживаете ссылки на объекты, которые не являются дольше используются

  • Посмотрите, какие структуры данных вы используете. Иногда, есть более памяти эффективным способом организовать Ваши данные

  • Посмотрите на ваши типы данных, которые вы используете Long или Double в тех местах, где байт будет достаточно?

  • Каждая программа будет использовать больше памяти в режиме отладки, чем в режиме не-Debug, но разница должна быть на порядка одного или 10-х мегабайт, а не сотни.Можете ли вы использовать задачу менеджер, чтобы проверить, сколько памяти вы используете вне режима отладки?

Смежные вопросы