将对象反序列化到内存
De-Serialize object to memory
我是 运行 我在 Java 中的索引程序,用于将庞大的数据集索引到树数据结构中。然后我将其序列化以将其保存在磁盘中。然后,我的搜索程序将反序列化对象并对索引上的每个给定输入执行搜索。
但我注意到每次反序列化对象和执行搜索都会产生开销并减慢我的搜索速度。
我想了解什么是反序列化对象并将其保存在内存中而不是每次使用 Java 反序列化的好方法?
此致,
尼什
你使用延迟加载吗?
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);
....
}
更新
如果您的程序作为链中间的某个服务提供者服务 - 考虑将其重写为 client/server 服务:
服务器:
- 您的服务器启动、读取和反序列化硬盘中的索引。
- 然后它创建套接字(或命名管道?)并监听特定端口上的连接。
- 当客户端连接到端口时,服务器从它读取请求,处理它并返回搜索结果。
客户:
- 当客户端启动时,它接受提供的输入(来自用户?来自控制台?)。
- 然后它连接到已知端口上的服务器。
- 向服务器发送输入,接收响应。
- 回应user/terminal/whatever。
- 终止。
注意:本地计算机上的网络开销只是几微秒的问题。因此,如果 re-reading/de-serializing 的开销大于此,client/server 方法会更有效。
我是 运行 我在 Java 中的索引程序,用于将庞大的数据集索引到树数据结构中。然后我将其序列化以将其保存在磁盘中。然后,我的搜索程序将反序列化对象并对索引上的每个给定输入执行搜索。
但我注意到每次反序列化对象和执行搜索都会产生开销并减慢我的搜索速度。 我想了解什么是反序列化对象并将其保存在内存中而不是每次使用 Java 反序列化的好方法?
此致, 尼什
你使用延迟加载吗?
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);
....
}
更新
如果您的程序作为链中间的某个服务提供者服务 - 考虑将其重写为 client/server 服务:
服务器:
- 您的服务器启动、读取和反序列化硬盘中的索引。
- 然后它创建套接字(或命名管道?)并监听特定端口上的连接。
- 当客户端连接到端口时,服务器从它读取请求,处理它并返回搜索结果。
客户:
- 当客户端启动时,它接受提供的输入(来自用户?来自控制台?)。
- 然后它连接到已知端口上的服务器。
- 向服务器发送输入,接收响应。
- 回应user/terminal/whatever。
- 终止。
注意:本地计算机上的网络开销只是几微秒的问题。因此,如果 re-reading/de-serializing 的开销大于此,client/server 方法会更有效。