我正在Java中运行我的索引程序,以将大型数据集索引到树数据结构中。然后我序列化它以将其保存在磁盘中。然后,我的搜索程序将反序列化对象,并对索引中的每个给定输入执行搜索。反序列化对象到内存
但我注意到,每次解序列化对象并执行搜索都会产生开销并降低我的搜索速度。 我想了解什么是反序列化对象并将其保存在内存中而不是每次使用Java解序列化的好方法?
Regards, Nish。
我正在Java中运行我的索引程序,以将大型数据集索引到树数据结构中。然后我序列化它以将其保存在磁盘中。然后,我的搜索程序将反序列化对象,并对索引中的每个给定输入执行搜索。反序列化对象到内存
但我注意到,每次解序列化对象并执行搜索都会产生开销并降低我的搜索速度。 我想了解什么是反序列化对象并将其保存在内存中而不是每次使用Java解序列化的好方法?
Regards, Nish。
你是否使用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链的中间 - 考虑到它改写成客户机/服务器服务:
服务器:
客户:(?从用户从控制台)
注意:本地计算机上联网的开销只需要几微秒。因此,如果重读/反序列化的开销比这更大,则客户机/服务器方法更高效。
谢谢您的回复@ankhzet。我将进一步探索客户机/服务器服务选项并重写我的代码。正如你所提到的,我认为这应该是正确的做法。 – nishanth
当你说“每次”你的意思是停止,并启动应用程序?如果是这样,那么你不能将它保存在内存中,因为应用程序退出时内存不存在。如果程序一直运行,就不要将它写入磁盘,而应在应用程序中保留对树的引用。 –
您的问题仍然缺乏一些上下文 – Dici
该程序将查找输入点的一组点中最近的点。我一直在想,因为程序每次调用main()方法都会搜索它找到的最近点,并返回结果并退出程序。因此,加载到内存的索引需要再次生成或序列化文件需要再次被反序列化。我不明白应用程序如何一直运行。我们如何实现这一目标? – nishanth