Как сохранить большой Java-объект между вызовами JVM run - PullRequest
0 голосов
/ 27 июня 2018

Я работаю с большими графиками, которые хранятся на диске в двоичном формате. Чтение графика с диска (SSD) и построение графика занимает примерно час. После построения график никогда не меняется. График занимает примерно 50 ГБ памяти, что не является проблемой для сервера. Тем не менее, мы часто хотим провести много экспериментов на графике, и оплата часа загрузки графика обходится дорого. Мне интересно, есть ли способ сохранить объект в памяти, чтобы виртуальная машина Java могла по существу найти объект в памяти.

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

Лучшая идея, которую я видел, - это использовать FileChannel , чтобы отобразить сериализованный объект в память, используя всегда постоянную JVM, а затем получить вторую JVM для чтения из этого FileChannel для десериализации объекта. Любые другие предложения будут высоко оценены!

1 Ответ

0 голосов
/ 27 июня 2018

Я предлагаю использовать ChronicleMa p (который я помог разработать)

Это:

  • сохранялось
  • 1010 * общий *
  • без кучи
  • может быть больше основной памяти
  • имеет опции для минимизации стоимости сериализации.

например. https://github.com/OpenHFT/Chronicle-Map/blob/master/docs/CM_Tutorial.adoc

interface PostalCodeRange {
    int minCode();
    void minCode(int minCode);

    int maxCode();
    void maxCode(int maxCode);
}

ChronicleMap<Integer, PostalCodeRange> cityPostalCodes = ChronicleMap
    .of(CharSequence.class, PostalCodeRange.class)
    .averageKey("Amsterdam")
    .entries(50_000)
    .createOrRecoverPersistedTo(cityPostalCodesFile, false);

ПРИМЕЧАНИЕ. В этом случае значение представляет собой лишнюю кучу памяти, которая позволяет получить доступ к полям без десериализации объекта.

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