2009-05-12 2 views
4

У меня есть общий словарь, который содержит кучу данных. Я хотел бы начать удаление элементов (я знаю, как определить, какие из них), когда размер словаря начинает занимать слишком много памяти.C# /. NET: использование памяти словаря

Каков наилучший способ для моей программы контролировать ОЗУ, используемую этим Словарем?

Каждый предмет в словаре является переменным размером.

+0

Почему бы не использовать кеш asp.net? он работает без какого-либо http-контекста и имеет функцию, которую вы просите ... (http://www.hanselman.com/blog/UsingTheASPNETCacheOutsideOfASPNET.aspx) –

ответ

5

работа из размера каждого элемента и умножить на Dictionary.Count

Один из способов показана here:

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

long StopBytes = 0; 
foo myFoo; 

long StartBytes = System.GC.GetTotalMemory(true); 
myFoo = new foo(); 
StopBytes = System.GC.GetTotalMemory(true); 
GC.KeepAlive(myFoo); // This ensures a reference to object keeps object in memory 

MessageBox.Show("Size is " + ((long)(StopBytes - StartBytes)).ToString()); 

C# имеет «SizeOf» оператор, который работает, как это делается в C/C++, однако он возвращает размер, что поле этого типа будет. Таким образом, для ссылочных типов (class, not struct) он всегда будет возвращать размер указателя (4 на 32-битных системах). Вместо этого используйте System.Runtime.InteropServices.Marshal.SizeOf().

+1

«Разработайте размер каждого элемента». Как? – BFree

+0

, как упоминалось выше, это не является потокобезопасным и фактически может возвращать отрицательное число. – jellomonkey

+1

@jellomonkey: правда, но вряд ли. Я бы не предложил, чтобы он делал это в фактическом производственном коде; скорее, в тестовом проекте для определения размера (при условии, что они не будут часто меняться). –

-1

Когда вы добавляете что-то в словарь, вычисляете размер элемента, добавляя и сохраняя сумму каждого добавленного элемента в качестве значения одного значения, когда вы удаляете элемент из словаря, уменьшите это значение.

+0

Как вычислить размер элемента? – stakx

1

Я не верю, что есть какой-либо API, который даст вам истинный размер объекта, но его можно определить, измеряя объем памяти, используемый до и после создания объекта; однако это не очень безопасно для потоков.

Вы можете использовать System.Runtime.InteropServices.Marshal.SizeOf(), хотя это не даст вам точный размер, это даст вам точную точку сравнения, чтобы вы могли сказать что-то вроде: если размер объекта увеличивается на X%, а затем удаляет Y количество элементов.

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

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