2013-07-03 6 views
4

У меня есть простой класс Person с 4 строками и целым числом.Память эффективный способ хранения многих мелких объектов

public class Person 
{ 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public int Age { get; set; } 
     public string PostalCode { get; set; } 
} 

Нам нужно хранить большое количество данных в памяти. Коллекция должна быть доступна для поиска в любом поле. Элементы будут добавлены и удалены как часть жизненного цикла.

Шаблон Flyweight не работает, потому что на объекте нет тонны повторяющихся значений, только на уровне поля. Какая модель или стратегия будут работать лучше всего, чтобы ограничить накладные расходы памяти и хорошо работать?

+13

Сколько стоит «много»? У вас есть несколько сотен тысяч, несколько миллионов, миллиарды? Память дешевая; у большинства людей их много. Если вы говорите миллионы или меньше, просто делайте все, что проще, вам, вероятно, не нужно беспокоиться о сокращении объема памяти. Если у вас их больше, вы, вероятно, захотите поместить их в базу данных, и вам не захочется, чтобы все они были в памяти сразу в программе на C#. – Servy

+0

Я бы не согласился с тем, что у большинства людей много памяти или возможность обновления до большого количества. Большая часть наших целевых клиентских ПК имеет всего лишь пару концертов в лучшем случае, легко пробить, что в 64-битном приложении .NET делает хруст числа. Но, конечно, это все относительно. –

+1

как долго строка? – Jodrell

ответ

2

Нам необходимо сохранить большое количество данных в памяти.

Затем массив Person[] бы быть скудным способом, но List<Person> была бы близка и гораздо легче работать. Просто убедитесь, что вы минимизировали повторное распределение, используя параметр Capacity.

Коллекция должна быть поиск по любому полю

Easy, .Where (p => p.FirstName == value).
Ускорение со Словари будет стоить памяти.

+0

Либо, вероятно, закончится память быстрее, чем связанный список или другая структура из-за последовательного распределения памяти указанного массива и связанной с ним фрагментации, не так ли? – Haney

+0

Сообщение будет означать, что он пытается найти способы использовать еще меньше памяти, например, вместо хранения 20-летнего возраста в миллионе предметов, хранить 20 один раз, а затем иметь миллион элементов, которые не имеют связанного с возрастом свойства с ним или что-то в этом роде. Теоретически, если есть много дублирования, что-то вроде этого может быть чистой победой, но это будет сложно. – Servy

+0

@Servy: свойство 'Age' было бы плохим примером (слишком маленьким). Возможно, вы сможете немного сэкономить на некоторых строках (общие имена дубликатов). –

0

Комбинация вещей может работать здесь ... Во-первых, это лучше всего оставить в качестве ссылочного типа, чтобы вы не копировали структуры везде при поиске. Используйте string.Intern(string), чтобы уменьшить использование памяти на двойные имена и фамилии, а также почтовые индексы ... Наконец, используйте Dictionary<TKey, TValue> для индексации этих записей по значению ... Возможно, TKey является строкой в ​​случае FirstName и TValue 'равно List<Person>, так что вы может искать людей по указанной строке ... Это называется инвертированным индексом: http://en.wikipedia.org/wiki/Inverted_index - альтернатива словарю - это реализовать свою собственную структуру Tree или Trie, такую ​​как префикс trie ... Вы торгуете скоростью O (log n) для меньше памяти, чем словарь O (1).

С точки зрения хранения LOT из них в памяти, это зависит от того, что много ... но в конечном итоге вы хотите иметь достаточное количество памяти для их обработки ... Или начнете расширяться до распределенных систем для совместного использования объекты, такие как шаблон MapReduce, или «пейджинг» на диск.

+0

Прежде чем использовать 'Intern', OP должен прочитать соображения производительности от Microsoft: http://msdn.microsoft.com/en-us/library/system.string.intern.aspx. Что касается использования Словаря, хотя это эффективная реализация, это не супер-память, а именно то, что, вероятно, ищет ОП. В словарях есть нетривиальное количество накладных расходов. – hatchet

+0

@hatchet true, но для достижения цели O (1) поиск данных довольно хорошо. Можете ли вы предложить более эффективную структуру? – Haney

+1

Дело в том, что ОП стремится уменьшить память. Словарь жертвует памятью для скорости. Если у вас очень ограниченная память, вы не можете этого сделать, вам нужно жертвовать скоростью для памяти. – Servy

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