Возможность адаптации коллекций Java - PullRequest
3 голосов
/ 31 марта 2012

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

Таким образом, мы смогли извлечь некоторые хорошие улучшения памяти, написав несколько специализированных карт и наборов, которые просто используют массивы для небольших размеров, а затем по умолчанию используют стандартные наборы Java и карты для большей емкости.

Однако, катание наших собственных специализированных версий набора и карт кажется глупым, если что-то уже есть в продаже. Я посмотрел на гуаву и коллекции Apache, и они, похоже, не предлагают ничего подобного. Похоже, Trove эффективнее использует память, чем коллекции JDK в целом, но неясно, попытается ли он минимизировать использование памяти следующим образом.

Ответы [ 2 ]

1 голос
/ 31 марта 2012

Возможно, вы захотите взглянуть на постоянных структур данных Clojure .Хотя «постоянная» часть может быть излишней для вас, она делает именно то, что вы ищете, и все еще очень быстро.Существует PersistentArrayMap, который повышается до PersistentHashMap, как только сбор превышает 16 единиц.

0 голосов
/ 31 марта 2012

Я не знаю ни одной такой библиотеки.

Проблема в том, что представления, которые используют наименьший объем памяти, имеют тенденцию:

  • быть несовместимыми с коллекциями JavaAPI, которые усложняют интеграцию, а
  • разрушают границы абстракции;например, путем добавления полей ссылок к типам элементов.

Это затрудняет создание библиотеки общего назначения по этим направлениям.Затем мы добавляем проблему, заключающуюся в том, что представление, которое адаптируется к минимизации использования пространства кучи по мере роста и сжатия коллекции, неизбежно создаст намного больше мусора ... и это будет иметь последствия для производительности ЦП.

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

...