У меня есть массив почти 1 000 000 записей, каждая запись имеет поле «имя файла».Дедупликативные строки экземпляров
Существует много записей с одинаковым именем файла.
Моя цель - улучшить объем памяти путем дедупликации экземпляров строк (экземпляры имен файлов, а не записи).
.NET Framework 2.0 - это ограничение. здесь нет LINQ.
я написал общий (и потокобезопасный) класс для дедупликации:
public class Deduplication<T>
where T : class
{
private static Deduplication<T> _global = new Deduplication<T>();
public static Deduplication<T> Global
{
get { return _global; }
}
private Dictionary<T, T> _dic;// = new Dictionary<T, T>();
private object _dicLocker = new object();
public T GetInstance(T instance)
{
lock (_dicLocker)
{
if (_dic == null)
{
_dic = new Dictionary<T, T>();
}
T savedInstance;
if (_dic.TryGetValue(instance, out savedInstance))
{
return savedInstance;
}
else
{
_dic.Add(instance, instance);
return instance;
}
}
}
public void Clear()
{
lock (_dicLocker)
{
_dic = null;
}
}
}
Проблемы с этим классом является то, что он добавляет много большего использование памяти, и он остается там до следующего GC ,
Я искал способ уменьшить объем памяти без добавления большого количества использования памяти и не дожидаясь следующего GC. Также я не хочу использовать GC.Collect()
, потому что он замораживает графический интерфейс на пару секунд.
Нет LINQ, нет ответа: - & ( – evanmcdonnal
Если я правильно прочитал, у вас возникли две проблемы: одна из них заключается в том, что все строковые объекты все же должны сначала создаваться, а затем собирать мусор после их поиска Во-вторых, словарь не может быть наиболее пространственно эффективной структурой для вашей потребности. Какова средняя длина имени файла и каково отношение дубликатов? – hatchet
Я создаю эти строки в своем коде из кодированных байтов UTF-16 средняя длина имени файла - 26,2 символа.6% имен файлов дублируют другое имя файла в других 42,4%. – DxCK