класс со многими строковыми переменными, вызывающими проблемы с памятью - PullRequest
0 голосов
/ 04 октября 2011

Справочная информация: У меня есть 2 класса A & B. Класс A содержит 1 int64, 1 int, 1 datetime, 6 строк, 1 байт [] и список объектов класса B.

Класс B содержит 2 Int64, 1 перечисление (4 значения), 5 строк.

Классы A и B имеют отношения основной детали между ними. В списке класса A может быть 0 или более объектов класса B.

Эти объекты используются для хранения результатов поиска из нашей базы данных.

У нас есть архитектура SOA. Клиент может выполнять поиск в определенном диапазоне дат и с фиксированным набором критериев. Мы используем их в сервисе для сбора результатов поиска и отправки их клиенту партиями. После отправки каждой партии мы удаляем эти объекты из сервиса.

Проблема: Если пользователь выполняет поиск, который возвращает результаты 200 тыс. (Объединенные классы A + класс B), потребление памяти сервисом увеличивается на 200 Мб. Но если последующие поиски возвращают только несколько результатов, память не возвращается в прежнее состояние. Когда я смотрю на счетчики производительности для службы, я вижу, что большая часть памяти занята объектами gen2.

Не пытаясь выполнить GC.Collect (), как я могу убедиться, что эта память возвращается быстрее? Я хотя и использовал интерфейс IDisposable в Классе A и Классе B, но, поскольку большинство полей в обоих из них являются строками, я не знаю, как их принудительно утилизировать.

Ответы [ 2 ]

7 голосов
/ 04 октября 2011

Возможно, вы захотите решить проблему с другой стороны.Вместо того, чтобы пытаться оптимизировать низкоуровневые вещи, такие как сборщик мусора, почему бы не сделать шаг назад и не спросить, действительно ли вам нужно возвращать результаты 200 000 раз?

Если это отображается в пользовательском интерфейсе, то отображается 200 000результаты совершенно бесполезны для человека, потому что это слишком много данных.Я бы посоветовал сделать какое-то пейджинговое отображение и показывать только 100 за раз (и получать только 100 за раз из службы).Или, может быть, показывать пользователю первые 100, а затем попросить их нажать кнопку, если они действительно хотят получить все 200 тыс.

Подобные усовершенствования окажут гораздо большее влияние, чем микрооптимизирующее управление памятью.

2 голосов
/ 04 октября 2011

Даже если вы делаете сбор мусора, я не думаю , что процесс вернет память операционной системе. В прошлый раз, когда я смотрел, CLR придерживался подхода, что если бы вы использовали столько памяти один раз, вам, вероятно, понадобится это снова позже.

На большинстве современных машин 200 МБ на самом деле не так уж много - это определенно реальная проблема или проблема?

...