C # /. NET: использование памяти словаря - PullRequest
6 голосов
/ 12 мая 2009

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

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

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

Ответы [ 3 ]

5 голосов
/ 12 мая 2009

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

Здесь показан один путь :

Примерный способ определения Размер использования объекта в памяти может быть сделано путем проверки общей памяти до и после создания объект. В следующем примере это предполагается, что у вас есть класс с именем 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 ++, однако он возвращает размер, которым будет поле этого типа. Таким образом, для ссылочных типов (класс, а не структура) он всегда будет возвращать размер указателя (4 в 32-битных системах). Вместо этого используйте System.Runtime.InteropServices.Marshal.SizeOf().

1 голос
/ 12 мая 2009

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

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

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

0 голосов
/ 12 мая 2009

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

...