У меня серьезная проблема с утечкой памяти? - PullRequest
3 голосов
/ 01 декабря 2010

Я создаю приложение Windows Form в 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 ...

Ответы [ 3 ]

3 голосов
/ 01 декабря 2010

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

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

0 голосов
/ 01 декабря 2010

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

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

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

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

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

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

0 голосов
/ 01 декабря 2010

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

Следите за пустыми списками, они занимают 40 байтов каждый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...