Пользователь загружает огромный файл, состоящий из 1 миллиона слов. Я разбираю файл и помещаю каждую строку файла в LinkedHashMap<Integer, String>
.Расход памяти LinkedHashMap
Мне нужен O (1) доступ и удаление ключом. Кроме того, мне нужно сохранить порядок доступа, перебирать из любой позиции и сортировать.
Потребление памяти огромно. Я включил String
s deduplication feature, который появляется в Java 8, но оказывается, что LinkedHashMap
потребляет большую часть памяти.
Я обнаружил, что LinkedHashMap.Entry
consumes 40 bytes, но есть только 2 указателя - один для следующей записи и один для предыдущей записи. Я думал, что 1 указатель должен быть 64 бит или 32 бита. Покупайте, если я делю 409,405,320 (байт) на 6 823 422 (количество записей). У меня есть 60 байт на запись.
Я думаю, что мне не нужен предыдущий указатель, следующий указатель должен быть достаточным для поддержания порядка. Почему LinkedHashMap
потребляет столько памяти? Как уменьшить потребление памяти?
Возможно ли, что оболочка Integer использует столько дополнительной памяти? Возможно, [реализация на основе int] (https://github.com/ggrandes/kvstore/blob/master/src/main/java/org/javastack/kvstore/structures/hash/IntLinkedHashMap.java) может помочь – Moira
@ 1blustone Если вы посмотрите на изображение, вы увидите, что 'Integer' занимает 16% кучи. 'LinkedHashMap.Entry's занимают более 3-х раз. Я считаю, что ОП хочет знать, почему это должно быть так. – Michael
Вы слишком быстро просматриваете источники. эта запись наследуется от 'HashMap.Node', которая имеет еще 4 поля, и есть дополнительные [заголовки объектов] (http://stackoverflow.com/q/26357186), размер которых является просто детализацией реализации. – glee8e