Java - кэширование экземпляра большого объекта для нескольких запусков, возможно, в NetBeans

Я пытаюсь выяснить, существует ли «простой» способ постоянного хранения экземпляра большого объекта в памяти JVM для совместного использования и повторного использования для нескольких запусков другими программами. Я работаю над netbeans, используя java 8. Данные составляют около 500 МБ сериализованных объектов. Они легко помещаются в ОЗУ, но каждый раз десериализация с диска занимает несколько минут.

В настоящее время программа загружает сериализованный объект с локального диска в память при каждом запуске. Поскольку данные считываются только во время теста, было бы оптимальным хранить их в памяти и обращаться к ним напрямую при каждом запуске.

Мы изучили RMI, но накладные расходы, процесс сортировки и передача убивают производительность. Мне было интересно, есть ли более прямой способ доступа к данным из программы, работающей на той же JVM, например, совместное использование памяти.

Множественные прогоны предназначены для проверки различных процессов обработки / параметров на одних и тех же входных данных.

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

Спасибо


person arco2ch    schedule 08.09.2015    source источник
comment
было бы оптимальным держать его в памяти и обращаться к нему напрямую при каждом запуске, это то, что делает сервер приложений   -  person AntJavaDev    schedule 08.09.2015
comment
Под тестом, я полагаю, мы говорим о модульных тестах?   -  person Nick Holt    schedule 08.09.2015
comment
Под тестом я имел в виду исполняемую программу, которая сначала загружает данные, а затем обрабатывает их с разными параметрами и создает отчеты о результатах. Не модульные тесты, извините за недоразумение!   -  person arco2ch    schedule 08.09.2015


Ответы (2)


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

Поэтому каждый раз, когда вы запускаете тесты, вам нужно их перезагружать, и это замедляет ваши тесты.

В такой ситуации вы также можете попробовать создать диск в памяти (RAM-диск). Итак, ваш файл сохраняется на диске с характеристиками барана.

Вот ссылка на команду ramfs для ее создания в системах Linux.

person Davide Lorenzo MARINO    schedule 08.09.2015
comment
Правильно, есть ли способ добиться чего-то подобного в Windows? - person arco2ch; 08.09.2015
comment
Да, много лет назад я использовал RAM-диск. Также в Windows. Я не помню имя извините - person Davide Lorenzo MARINO; 08.09.2015
comment
Я пробовал с ImDisk, и время десериализации уменьшилось на 80%. . Возможно, это не самое лучшее решение, но оно точно поможет в разработке! Спасибо Давиде - person arco2ch; 08.09.2015

Сериализация Java никогда не будет хорошо работать как механизм сохранения - изменения в классах могут легко оказаться несовместимыми с ранее сохраненными объектами, что означает, что они больше не могут быть десериализованы (и в целом все объектные модели так или иначе развиваются).

Хотя предложения действительно не относятся к теме SO, я бы посоветовал рассмотреть возможность использования распределенного кеша, такого как Hazelcast или Согласованность.

Хотя вам все равно придется загружать объекты, как Hazelcast, так и Coherence предоставляют масштабируемый способ хранения объектов, к которым можно получить доступ из других JVM, и предоставляют различные способы обработки долгосрочного сохранения. и развивающиеся классы.

Однако ни один из них не работает хорошо с графами больших объектов, поэтому вам следует рассмотреть возможность разбиения модели на пары ключ / значение.

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

public class OrderItemKey
{
  private OrderKey orderKey;
  private int itemIdex;

  ...
} 

И значение вроде этого:

public class OrderItem
{
  private ProductKey productKey;
  private int quantity;

  ...
}

Где OrderItems может находиться в одном кэше, а Products - в другом.

После того, как у вас есть модель, которая хорошо работает с распределенным кешем, вам нужно подумать о совместном размещении связанных объектов (чтобы они хранились в одной JVM) и репликации ссылочных объектов.

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

person Nick Holt    schedule 08.09.2015
comment
Это правильный способ сделать это, хотя решение с RamDisk сработало очень хорошо и действительно простое. Спасибо, что указали правильный способ сделать это. (Я не могу проголосовать, так как у меня недостаточно репутации) - person arco2ch; 08.09.2015
comment
@ arco2ch не недооценивает проблемы, с которыми вы столкнетесь, используя сериализацию Java в качестве механизма сохранения; serialVersionUIDs могут делать только определенные действия, и как только поле будет удалено или изменит его тип, вы столкнетесь с ошибкой - person Nick Holt; 08.09.2015