Я начал профилировать память нашего приложения, потому что недавно мы получили несколько отчетов о производительности и исключениях нехватки памяти. Приложение разработано на C # .Net Winforms (.NET Framework 2.0)
Когда приложение запускалось, профилировщик ANT показывает 17,7 МБ объектов, работающих в Gen 2.
Когда приложение запускается, оно читает почтовые индексы 77000+ из сериализованного файла xml на диске и сохраняет их в Hashtable. Пожалуйста, смотрите пример кода ниже
public Class ZipCodeItem
{
private string zipCode;
private string city;
private string state;
private string county;
private int tdhCode;
private string fipsCounty;
private string fipsCity;
Public ZipCodeItem()
{
// Constructor.. nothing interesting here
}
// Bunch of public getter/setter properties
}
Вот статический класс, который считывает сериализованные данные почтового индекса из файла на диске и загружает почтовые индексы.
internal sealed class ZipTypes
{
private static readonly Hashtable zipCodes = new Hashtable();
public static ArrayList LookupZipCodes(string zipCode)
{
if (zipCodes.Count == 0)
LoadZipCodes();
ArrayList arZips = new ArrayList();
// Search for given zip code and return the matched ZipCodeitem collection
if (zipCodes.ContainsKey(zipCode))
{
// Populate the array with the matched items
}
// Omitted the details to keep it simple
return arZips;
}
private static bool LoadZipCodes()
{
using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read))
{
// unzip it.. Omitted the details to keep it simple
// Read the zipcodes from the flat xml file on disk and load the local zipCodes HashTable
}
}
}
Этот класс и корр. ZipCodes доступны по всему приложению.
Приблизительно 14 мегабайт из 17,7 мегабайт объектов Gen 2 являются либо классами zipCodeItems, либо его дочерними классами String.
Я хотел бы изменить свой код на такой, чтобы НЕ сохранять эти объекты с 77000+ объектами почтового индекса в памяти (в хеш-таблице), но предоставлять сопоставленные элементы zipCode, когда приложению это необходимо.
Любые предложения Как решить эту проблему? Заранее спасибо.