2015-09-10 58 views
0

我正在Java中运行我的索引程序,以将大型数据集索引到树数据结构中。然后我序列化它以将其保存在磁盘中。然后,我的搜索程序将反序列化对象,并对索引中的每个给定输入执行搜索。反序列化对象到内存

但我注意到,每次解序列化对象并执行搜索都会产生开销并降低我的搜索速度。 我想了解什么是反序列化对象并将其保存在内存中而不是每次使用Java解序列化的好方法?

Regards, Nish。

+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); 

    .... 
} 

Upd。

如果你的程序是作为一些服务提供商IM链的中间 - 考虑到它改写成客户机/服务器服务:

服务器:

  • 你的服务器启动时,读取和去从硬盘序列化索引。
  • 然后它创建套接字(或命名管道?)并监听某个端口上的连接。
  • 当客户端连接到端口时,服务器从它读取请求,处理它并将搜索结果发回。

客户:(?从用户从控制台)

  • 当客户端启动,它需要提供输入。
  • 然后它连接到已知端口上的服务器。
  • 将输入发送到服务器,接收响应。
  • 给予用户/终端/任何响应。
  • 终止。

注意:本地计算机上联网的开销只需要几微秒。因此,如果重读/反序列化的开销比这更大,则客户机/服务器方法更高效。

+0

谢谢您的回复@ankhzet。我将进一步探索客户机/服务器服务选项并重写我的代码。正如你所提到的,我认为这应该是正确的做法。 – nishanth