2015-09-10 2 views
0

Я запускаю свою программу индексирования в Java, чтобы индексировать огромный набор данных в структуру данных дерева. Затем я сериализую его, чтобы сохранить его на диске. Моя программа поиска затем де-сериализует объект и выполняет поиск каждого заданного входа в индексе.De-Serialize object to memory

Но я замечаю, что каждый раз, когда Де-сериализация объекта и выполнение поиска имеют накладные расходы и замедляют мой поиск. Я хотел понять, что было бы хорошим способом де-сериализации объекта и сохранить его в памяти вместо De-serializing каждый раз с использованием Java?

С уважением, Ниш.

+0

Когда вы говорите «каждый раз», вы имеете в виду остановку и запуск приложения? Если это так, то вы не можете сохранить его в памяти, потому что память исчезает, когда приложение выходит. Если программа работает все время, просто не записывайте ее на диск и вместо этого храните ссылку на Дерево в своем приложении. –

+0

В вашем вопросе по-прежнему не хватает контекста – Dici

+0

Программа предназначена для поиска ближайших точек из набора точек на входную точку. Я думал, так как программа имеет метод main() каждый раз, когда она вызывается для поиска ближайшей точки, которую она находит, и возвращает результат и выходит из программы. И поэтому индекс, загруженный в память, должен быть снова сгенерирован или необходим сериализованный файл снова десериализоваться. Я не понимаю, как приложение работает все время. Как мы это достигаем? – nishanth

ответ

-1

Вы используете lasy-loading?

Index indexCache = null; 

synchronized Index getIndex() { 
    if (indexCache == null) 
     indexCache = deserializeIndex(); 

    return indexCache; 
} 

Index deserializeIndex() { 
    File indexFile = new File(indexFilePath()); 

    .... 
} 

List<Result> searchInIndex(Query query) { 
    Index index = getIndex(); 

    List<Result> results = index.fetch(query); 

    .... 
} 

Обновление.

Если ваша не программа выступает в качестве некоторого поставщика услуг им в середине цепи - рассмотреть переписать его в клиент/сервер службы:

Сервер:

  • Ваш начинает сервер, читает и де- сериализует индекс из жесткого диска.
  • Затем он создает сокет (или именованный канал?) И слушает соединения на определенном порту.
  • Когда клиент подключается к порту, сервер считывает с него запрос, обрабатывает его и отправляет результаты поиска обратно.

Клиент: (? От пользователя с консоли)

  • При запуске клиента, он принимает при условии ввода.
  • Затем он подключается к серверу на известном порту.
  • Отправляет вход на сервер, получает ответ.
  • Дает ответ пользователю/терминалу/независимо.
  • Завершение.

Примечание: Накладные расходы на локальную машину - это вопрос микросекунд. Таким образом, подход клиент/сервер более эффективен, если накладные расходы на повторное чтение/де-сериализация больше.

+0

Благодарим вас за ответ @ankhzet. Я еще раз изучу опцию «Клиент/сервер» и перепишу свой код. Как вы упомянули, я считаю, что это должен быть правильный способ сделать это. – nishanth