Если вы начинаете исчерпывать доступную память, то вы, вероятно, также скоро начнете исчерпывать доступные индексы массива, размер массива ограничен до Integer.MAX_VALUE
, и при использовании double в качестве элементов массива «только» 32 ГБ.
Получение машины с 32 ГБ памяти стоит дорого, но, вероятно, не так дорого, как ваше время на изменение алгоритма и все связанные с ним тесты.
Однако, если клиент работает на краях памяти, а его наборы данных все еще растут, то имеет смысл сейчас перекусить пулю и внести изменения, чтобы иметь возможность использовать меньше памяти в любой момент времени. поскольку они, скорее всего, скоро все равно перерастут массив.
Другой вариант, который у вас есть, если предположить, что массив несколько заполнен, - это использовать одну из различных структур данных разреженного массива, хотя они, как правило, выгодны, только если ваш массив заполнен менее чем на 20%. *
Редактировать : Поскольку кажется, что вы уже исследовали альтернативы, тогда MappedByteBuffer вполне может быть подходящим вариантом. Очевидно, что это повлияет на производительность, однако, если вы выполняете в основном последовательные операции чтения и записи из массива, это не должно быть слишком плохо. Если вы делаете случайное чтение и запись, то это будет очень медленно и очень быстро. Или очень медленно очень медленно ... в зависимости от того, как вы смотрите на эти вещи; -)