Удалить неиспользованную выделенную память из HashMaps - PullRequest
1 голос
/ 10 мая 2011

Я хочу прочитать некоторые XML-файлы и преобразовать их в график (без графики, только модель). Но поскольку файлы очень велики (2,2 ГБ), объект моей модели, который содержит всю информацию, становится еще больше (в 4 раза больше размера файла ...).

Погуглив в сети Я попытался найти способы уменьшить размер объекта. Я пробовал разные типы коллекций, но хотел бы придерживаться HashMap (потому что у меня должен быть произвольный доступ). Актуальные клавиши и значения составляют лишь небольшой объем выделенной памяти. Большая часть хеш-таблицы пуста ...

Если я не ошибаюсь, сборка мусора не поможет мне освободить выделенную память и уменьшить размер хэш-карты. Есть ли другой способ освободить неиспользуемую память и уменьшить хэш-карту? Или есть способ сделать идеальное хеширование? Или я просто использую другую коллекцию?

Заранее спасибо,

Себастьян

Ответы [ 6 ]

1 голос
/ 10 мая 2011

A HashMap - это обычно большой массив ссылок, заполненный до определенного процента емкости. Если заполнено только 80% карты, оставшиеся 20% ячеек массива не используются (т. Е. Являются нулевыми). Дополнительные издержки - это только пустые (нулевые) ячейки.

В 32-разрядном ЦП каждая ячейка массива обычно имеет размер 4 байта (хотя некоторые реализации JVM могут выделять 8 байтов). Это не так уж много неиспользуемого пространства в целом.

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

Ваш вопрос подразумевает, что есть больше выделенных, но неиспользуемых объектов, о которых вы беспокоитесь. Но как это так?

Добавление

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

Если вы можете (сверх) оценить необходимое количество ячеек, предварительное выделение карты может уменьшить или даже устранить операции изменения размера.

0 голосов
/ 11 мая 2011

Вы могли бы дать коллекции Trove выстрел.Они рекламируют его как замену коллекций java.util, более экономящую время и пространство.

0 голосов
/ 10 мая 2011

Если вы действительно серьезно относитесь к этому и у вас есть время, чтобы сэкономить, вы можете сделать собственную реализацию интерфейса Map на основе минимального идеального хеширования

Если ваши ключи строковые, то вам, очевидно, доступна карта здесь . Я сам не пробовал, но хвастается уменьшением использования памяти.

0 голосов
/ 10 мая 2011

Одна вещь, которая может вступить в игру, это то, что у вас могут быть подстроки, которые ссылаются на старые большие строки, и эти подстроки делают невозможным сбор GC-массивов, которые являются слишком большими.

Это происходит, когда вы используете некоторые синтаксические анализаторы XML, которые возвращают атрибуты / значения в качестве подстроки из строки большего размера.(Подстрока является только ограниченным представлением большей строки).

Попытайтесь поместить свои строки в карту, выполнив что-то вроде этого:

map.put(new String(key), new String(value));

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

0 голосов
/ 10 мая 2011

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

0 голосов
/ 10 мая 2011

То, что вы спрашиваете, не так ясно, неясно, занимает ли память объекты, которые вы помещаете в hasmap, или самим hashmap, чего не должно быть, поскольку он содержит только ссылки. *

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...