Java - 为多次运行缓存大型对象实例,可能在 NetBeans 中
Java - Caching of a large object instance for multiple runs, possibly in NetBeans
我想弄清楚是否有一种 'simple' 方法可以在 JVM 内存中持久存储一个大对象实例,以供其他程序共享并重新用于多个 运行s .
我正在使用 java 8 处理 netbeans。数据是大约 500 MB 的序列化对象。它们很容易放入 RAM,但每次都需要几分钟从磁盘反序列化。
目前,程序为每个 运行 从本地磁盘加载一个序列化对象到内存中。由于仅在测试期间读取数据,因此最好将其保存在内存中并在每个 运行.
时直接访问它。
我们研究了 RMI,但开销、编组过程和传输会降低性能。
我想知道是否有更直接的方法从同一 JVM 上的程序 运行ning 访问数据,例如共享内存。
多个 运行 用于测试对同一输入数据的不同处理/参数。
我愿意接受关于实现此目标的最佳实践的建议'pre-loading',任何提示都将不胜感激。
谢谢
Java 序列化永远不会像持久化机制那样发挥作用 - 对 类 的更改很容易与以前存储的对象不兼容,这意味着它们不能再被反序列化(并且一般来说,所有对象模型都会以一种或另一种方式发展。
虽然关于 SO 的建议确实离题,但我建议考虑使用分布式缓存,例如 Hazelcast or Coherence。
虽然您仍然需要加载对象,但两者 Hazelcast or Coherence 都提供了一种可扩展的方式来存储可以从其他 JVM 访问的对象,并提供了处理长期持久性和不断发展的各种方式 类。
但是,两者都不适用于大对象图,因此您应该考虑将模型分成 key/value 对。
一个示例可能是订单系统,其中键可能是这样的组合:
public class OrderItemKey
{
private OrderKey orderKey;
private int itemIdex;
...
}
值是这样的:
public class OrderItem
{
private ProductKey productKey;
private int quantity;
...
}
其中 OrderItem
s 可能在一个缓存中,而 Product
s 可能在另一个缓存中。
一旦您获得了可以很好地与分布式缓存配合使用的模型,您就需要查看共同定位的相关对象(以便它们存储在同一个 JVM 中)和复制引用对象。
当您对模型感到满意时,考虑将处理移动到对象所在的缓存节点中,而不是将它们拉出来对它们执行操作。这减少了网络负载,带来了可观的性能提升。
如果我理解得很好,您需要从磁盘读取大量数据并将这些数据仅用于测试目的。
所以每次 运行 测试都需要重新加载它们,这会减慢测试速度。
如果是这种情况你也可以尝试在内存上创建一个磁盘(ram disk)。所以你的文件保存在磁盘上,具有内存的性能。
这是一个 link 命令 ramfs 在 linux 系统
上创建它
我想弄清楚是否有一种 'simple' 方法可以在 JVM 内存中持久存储一个大对象实例,以供其他程序共享并重新用于多个 运行s . 我正在使用 java 8 处理 netbeans。数据是大约 500 MB 的序列化对象。它们很容易放入 RAM,但每次都需要几分钟从磁盘反序列化。
目前,程序为每个 运行 从本地磁盘加载一个序列化对象到内存中。由于仅在测试期间读取数据,因此最好将其保存在内存中并在每个 运行.
时直接访问它。我们研究了 RMI,但开销、编组过程和传输会降低性能。 我想知道是否有更直接的方法从同一 JVM 上的程序 运行ning 访问数据,例如共享内存。
多个 运行 用于测试对同一输入数据的不同处理/参数。
我愿意接受关于实现此目标的最佳实践的建议'pre-loading',任何提示都将不胜感激。
谢谢
Java 序列化永远不会像持久化机制那样发挥作用 - 对 类 的更改很容易与以前存储的对象不兼容,这意味着它们不能再被反序列化(并且一般来说,所有对象模型都会以一种或另一种方式发展。
虽然关于 SO 的建议确实离题,但我建议考虑使用分布式缓存,例如 Hazelcast or Coherence。
虽然您仍然需要加载对象,但两者 Hazelcast or Coherence 都提供了一种可扩展的方式来存储可以从其他 JVM 访问的对象,并提供了处理长期持久性和不断发展的各种方式 类。
但是,两者都不适用于大对象图,因此您应该考虑将模型分成 key/value 对。
一个示例可能是订单系统,其中键可能是这样的组合:
public class OrderItemKey
{
private OrderKey orderKey;
private int itemIdex;
...
}
值是这样的:
public class OrderItem
{
private ProductKey productKey;
private int quantity;
...
}
其中 OrderItem
s 可能在一个缓存中,而 Product
s 可能在另一个缓存中。
一旦您获得了可以很好地与分布式缓存配合使用的模型,您就需要查看共同定位的相关对象(以便它们存储在同一个 JVM 中)和复制引用对象。
当您对模型感到满意时,考虑将处理移动到对象所在的缓存节点中,而不是将它们拉出来对它们执行操作。这减少了网络负载,带来了可观的性能提升。
如果我理解得很好,您需要从磁盘读取大量数据并将这些数据仅用于测试目的。
所以每次 运行 测试都需要重新加载它们,这会减慢测试速度。
如果是这种情况你也可以尝试在内存上创建一个磁盘(ram disk)。所以你的文件保存在磁盘上,具有内存的性能。
这是一个 link 命令 ramfs 在 linux 系统
上创建它