Огромная таблица строк в Java - PullRequest
3 голосов
/ 11 сентября 2011

У меня вопрос о хранении огромного количества строк в памяти приложения. Мне нужно загрузить из файла и сохранить около 5 миллионов строк, каждая из которых максимум 255 символов (URL), но в основном ~ 50. Время от времени мне нужно искать одного из них. Возможно ли сделать это приложение работоспособным на ~ 1 ГБ оперативной памяти?

Будет

ArrayList <String> list = new ArrayList<String>();

работа

Насколько я знаю, String в java кодируется в UTF-8, что дает мне огромное использование памяти. Можно ли сделать такой массив со строкой, закодированной в ANSI?

Это консольное приложение, запускаемое с параметрами:

java -Xmx1024M -Xms1024M -jar "PServer.jar" nogui

Ответы [ 3 ]

10 голосов
/ 11 сентября 2011

Последние JVM поддерживают по умолчанию -XX:+UseCompressedStrings, в котором хранятся строки, которые используют только ASCII в качестве байта [] для внутреннего использования.

Наличие нескольких ГБ текста в списке не является проблемой, но это может занятьнекоторое время для загрузки с диска (много секунд)

Если средний URL-адрес составляет 50 символов, которые являются ASCII, с 32 байтами служебной информации на строку, 5 млн записей могут использовать около 400 МБ, что не так много длясовременный ПК или сервер.

2 голосов
/ 11 сентября 2011

Java String - полноценный объект. Это означает, что, исходя из самих символов строки, в ней хранится другая информация (указатель на класс объекта, счетчик с количеством указателей, указывающих на него, и некоторые другие данные инфраструктуры). Таким образом, пустая строка уже занимает 45 байт в памяти (как вы можете видеть здесь ). Теперь вам просто нужно добавить максимальную длину вашей строки и сделать несколько простых вычислений, чтобы получить максимальную память для этого списка.

Во всяком случае, я бы посоветовал вам загрузить строку как byte [] , если у вас есть проблемы с памятью. Таким образом, вы можете контролировать кодировку и выполнять поиск.

1 голос
/ 11 сентября 2011

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

Если вам нужно выполнить поиск, используйте SortedSet, а не ArrayList

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