Многозначная карта с эффективным использованием памяти

Привет у меня есть следующая проблема: я храню строки и соответствующий список целочисленных значений вMultiValueMap<String, Integer> Я храню около 13 000 000 миллионов строк, и одна строка может иметь до 500 или более значений. Для каждого значения у меня будет произвольный доступ на карте. Так что наихудший случай - 13 000 000 * 500 пут-коллов. Теперь скорость карты хорошая, но объем памяти увеличивается.MultiValueMap<String, Integer> ничего больше, чемHashMap/TreeMap<String, <ArrayList<Integer>>, И HashMap, и TreeMap имеют довольно много памяти. Я не буду изменять карту, как только она будет сделана, но мне нужно, чтобы она была быстрой и как можно меньшей для произвольного доступа в программе. (Я храню его на диске и загружаю при запуске, файл сериализованной карты занимает около 600 МБ, а в памяти - около 3 ГБ?)

самое эффективное использование памяти - хранить строку в массиве отсортированных строк и иметь соответствующий двумерный массив int для значений. Таким образом, доступ будет представлять собой двоичный поиск по строковому массиву и получение соответствующих значений.

Теперь у меня есть три способа добраться туда:

Я использую отсортированный MultivalueMap (TreeMap) для фазы создания, чтобы сохранить все. После того, как я закончу с получением всех значений, я получаю строковый массив, вызываяmap.keyset().toArray(new String[0]); Создайте двумерный массив int и получите все значения из многозначной карты. Pro: Это легко реализовать, это все еще быстро при создании. Con: Это занимает еще больше памяти при копировании с карты в массивы.

Я использую Arrays или, может быть, ArrayLists с самого начала и храню там все Pro: наименьшая нагрузка на память. Con: это будет очень медленно, потому что мне придется сортировать / копировать массив каждый раз, когда добавляется новый ключ, а также мне нужно реализовать собственную (возможно, даже более медленную) сортировку, чтобы сохранить соответствующий массив int в том же порядке, как струны. Трудно реализовать

Я использую Arrays и MultivalueMap в качестве буфера. После того, как программа закончила 10% или 20% фазы создания, я добавлю значения в массивы и сохраню их в порядке, затем начну новую карту. Pro: Вероятно, все еще достаточно быстро и память достаточно эффективна. Против: Трудно реализовать.

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

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

Ответы на вопрос(5)

Ваш ответ на вопрос