Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java—缓存大型对象实例以进行多次运行,可能是在NetBeans中_Java_Caching_Netbeans_Shared Memory_Datapersistance - Fatal编程技术网

Java—缓存大型对象实例以进行多次运行,可能是在NetBeans中

Java—缓存大型对象实例以进行多次运行,可能是在NetBeans中,java,caching,netbeans,shared-memory,datapersistance,Java,Caching,Netbeans,Shared Memory,Datapersistance,我试图弄清楚是否有一种“简单”的方法可以在JVM内存中持久存储一个大型对象实例,以供其他程序共享和多次运行时重复使用。 我正在使用Java8开发netbeans。数据约为500 MB的序列化对象。它们很容易放入RAM中,但每次从磁盘反序列化都需要几分钟的时间 当前,程序会在每次运行时将一个序列化对象从本地磁盘加载到内存中。由于数据仅在测试期间读取,因此最好将其保存在内存中,并在每次运行时直接访问 我们已经研究了RMI,但是开销、编组过程和传输会影响性能。 我想知道是否有更直接的方法从运行在同一J

我试图弄清楚是否有一种“简单”的方法可以在JVM内存中持久存储一个大型对象实例,以供其他程序共享和多次运行时重复使用。 我正在使用Java8开发netbeans。数据约为500 MB的序列化对象。它们很容易放入RAM中,但每次从磁盘反序列化都需要几分钟的时间


当前,程序会在每次运行时将一个序列化对象从本地磁盘加载到内存中。由于数据仅在测试期间读取,因此最好将其保存在内存中,并在每次运行时直接访问

我们已经研究了RMI,但是开销、编组过程和传输会影响性能。 我想知道是否有更直接的方法从运行在同一JVM上的程序访问数据,比如共享内存

多次运行是为了在相同的输入数据上测试不同的处理/参数

我愿意就实现“预加载”的最佳实践提出建议,如有任何提示,将不胜感激


感谢

Java序列化永远不会像持久性机制那样发挥作用-对类的更改很容易与以前存储的对象不兼容,这意味着它们不能再反序列化(通常所有对象模型都会以某种方式演变)

虽然建议确实是离题的,但我建议您考虑使用分布式缓存,如或

虽然您仍然需要加载对象,但两者都可以,或者提供一种可伸缩的方式来存储可从其他JVM访问的对象,并提供各种方式来处理长期持久性和不断演化的类

但是,这两种方法都不适用于大对象图,因此您应该考虑将模型分解为键/值对

例如,订单系统中的密钥可能是这样的组合:

public class OrderItemKey
{
  private OrderKey orderKey;
  private int itemIdex;

  ...
} 
public class OrderItem
{
  private ProductKey productKey;
  private int quantity;

  ...
}
值是这样的:

public class OrderItemKey
{
  private OrderKey orderKey;
  private int itemIdex;

  ...
} 
public class OrderItem
{
  private ProductKey productKey;
  private int quantity;

  ...
}
其中,
OrderItem
s可以在一个缓存中,而
Product
s可以在另一个缓存中

一旦您有了一个能够很好地使用分布式缓存的模型,您就需要考虑共同定位相关对象(因此它们存储在同一个JVM中)和复制引用对象


当您对模型满意时,可以考虑将处理移动到对象所在的缓存节点中,而不是将它们拉出以对其执行操作。这将减少网络负载,从而获得可观的性能提升。

如果我理解得很好,您需要从磁盘读取大量数据,并且仅将这些数据用于测试目的

因此,每次运行测试时,都需要重新加载它们,这会降低测试速度

如果出现这种情况,您还可以尝试在内存上创建磁盘(ram磁盘)。因此,您的文件保存在一个磁盘上,具有ram的性能


下面是命令ramfs在linux系统上创建它的一个例子

“最好将它保存在内存中,并在每次运行时直接访问它”,这是应用程序服务器通过测试所做的,我想我们谈论的是单元测试?所谓测试,我指的是一个可运行的程序,它首先加载数据,然后使用不同的参数对其进行操作,并生成输出报告。不是单元测试,很抱歉造成混淆!没错,有没有办法在windows上实现类似的功能?是的,我多年前也在windows中使用了ram磁盘。我不记得Sorry的名字了,反序列化时间减少了80%。这可能不是最好的解决方案,但它确实有助于开发目的!感谢DavideThis,这是一种正确的方法,尽管使用RamDisk的解决方案效果很好,而且非常简单。谢谢你指出了正确的方法。(我不能投票,因为我没有足够的声誉)@arco2ch不要低估使用Java序列化作为持久化机制会遇到的问题
serialVersionUID
s只能在字段被删除或更改其类型时执行如此多的操作,否则将导致错误