Если вы знакомы с E4X и XML в AS3, взгляните на это CRAZINESS.
У меня есть 420 КБ XML.Довольно большой, да.Его структура довольно проста:
<Nodes>
<Node ID="1">
<Element Name="A" />
<Element Name="B" />
</Node>
</Nodes>
У меня от 2 до 10 элементов в общей сложности и около 50 узлов.
Я храню все отдельные коллекции "Элементов" вСловарь, где ключом является значение атрибута Node ID.Не спрашивай, почему я так сделал, хорошо?У меня была веская причина для этого.
Хорошо, поэтому мы получили словарь с примерно 50 ключами, каждый из которых содержит значения, которые являются списками XMLL от 2 до 10 элементов.
Итак,Большой XML разбит на несколько списков XMLL и хранится в Словаре следующим образом:
for each (var obj: XML in objects)
_SomeDictionary[int(obj.@ID)] = obj.Element;
Теперь вот странная часть:
- Запуск приложения.
- Инициализациянекоторые объекты используют 10 из 50 значений словаря.
- Потребление памяти: 36 МБ.
- Запуск приложения.
- Инициализация объектов с использованием ALL50 значений словаря.
- Потребление памяти: 47 МБ.
Но ... если я сделаю это так:
for each (var obj: XML in objects)
_SomeDictionary[int(obj.@ID)] = String(obj.Element);
Я получу это:
- Запустить приложение.
- Инициализировать объекты, используя ВСЕ 50 значений словаря, и перед инициализацией вернуть значение словаря обратно в XMLList.
- Потребление памяти: 16 МБ .
Итак, я выбрал 30 МБ памяти, просто набрав thСписок XMLL для строки.Почему это происходит?В конце концов, внутри функции инициализации, которая обрабатывает значение словаря, ВСЕГДА будет создаваться список XML.
Второй вопрос: когда НЕ приведен тип String, ПОЧЕМУ увеличивается объем памяти, когда я обрабатываю значения словаря ???Это уже все списки XML!Почему объем памяти увеличивается только с 36 МБ до 47 МБ, когда я фактически извлекаю XML-список из словаря и просматриваю его с помощью функции, которая инициализирует некоторые объекты на его основе?
PS: функция невызывает утечку памяти: я уже доказал, что получаю только 16 МБ, когда использую ту же функцию, но вместо того, чтобы дать ему список XML, извлеченный непосредственно из словаря, я даю ему список XML, приведенный из строки, извлекаемой изсловарь.