2015-09-08 16 views
1

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

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

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

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

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

Благодаря

+0

«было бы оптимально держать его в памяти и доступ к нему непосредственно на каждом прогоне», это то, что сервер приложений делает – AntJavaDev

+0

с помощью теста , Я предполагаю, что мы говорим об модульных тестах? –

+0

По испытанию я имел в виду запущенную программу, которая сначала загружает данные, затем работает с ней с разными параметрами и создает выходные отчеты. Не Unit Tests, извините за путаницу! – arco2ch

ответ

0

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

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

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

Вот в link для команды RAMFS создать его на системы Linux

+0

Правильно, есть ли способ добиться чего-то подобного в окнах? – arco2ch

+0

Да, я использовал дисковый диск много лет назад Также в Windows. Я не помню Имя извините –

+0

Я попытался с [ImDisk] (http: // http: //www.ltr-data.se/opencode.html/#ImDisk), а время десериализации уменьшилось на 80%. Это может быть не самое приятное решение, но оно помогает в разработке целей! Спасибо, Давиде – arco2ch

1

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

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

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

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

Примером может быть система заказа, где ключ может быть составным, как это:

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

    ... 
} 

И ценность, как это:

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

    ... 
} 

Где OrderItem s может быть в одном кэше, в то время как Product s будет в другом.

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

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

+0

Это правильный способ сделать это, хотя решение с RamDisk получилось очень хорошо и очень просто. Спасибо, что указали «правильный» способ сделать это. (Я не могу проголосовать, поскольку у меня недостаточно репутации) – arco2ch

+0

@ arco2ch не недооценивают проблемы, с которыми вы столкнетесь, используя Java Serialization в качестве механизма сохранения; 'serialVersionUID' может делать только так, как только поле будет удалено или изменит его тип, вы будете избиты –

 Смежные вопросы

  • Нет связанных вопросов^_^