2017-08-03 276 views
0

我有一个Java程序,它需要使用导入的源代码包中的一个函数,该程序包会将2GB数据加载到内存中并使用它进行计算。Java - 将数据加载到内存一次,并多次使用

但每次我调用函数时,加载过程都会被处理,这非常耗时。

我的程序的结构是这样的:

Socket Server (listening on a port) 

|_ Multi Server Thread (Work as a input stream reader) 

...|_ Sample Protocol (deal with the input steam using the data related functions) 

我知道这是一个问题,太宽,但:

  1. 有没有我可以只运行一次装载和使用任何总体思路它在事后做所有的计算?

  2. 如果我在顶层导入包(在套接字服务器中),是否可以帮助我以某种方式加速加载过程?

  3. 企业使用哪种更常用的方法?

+1

这是一个相当广泛的问题,但如果您真的想要并且可以将所有数据存储在堆内存中(由于对象开销,这可能比2GB持久数据多得多),只需指定一个实例或静态 - 在开始加载过程之前,已经将已处理的数据与已确定范围的变量一起保存。如果需要,您还可以添加同步机制以在后台安全地刷新它。 – Mena

+0

我最近在我的办公室里有一些数据。我从星期天的七种方式开始讨论它。您无法解决这样的事实,即加载一次非常耗时,并且在一个实例中,数据太多,导致在该盒子上导致堆分配错误。你无法加速太多,但如果你可以在最高层加载一次,它会让所有其他类使用它。您还需要对其进行同步,以便所有线程都一起崩溃到数据中。 –

+0

确保您了解从不同线程看到的陈旧指针的影响。当一个线程将2GB数据保存在一个变量中时,另一个线程仍然可以看到'null'并再次加载数据。 –

回答

0

由于这个问题没有得到很长一段时间的任何答案,这里是 一个小总结:

原来在我当前使用的方法,如果我加载在最高水平的lib (Socket服务器),我们可以确保对于其中的每个线程,我们不需要再次加载库。

在企业层面,还有对Java更好的多线程功能,如:

newCachedThreadPool()

的newFixedThreadPool()

newSingleThreadExecutor()

的newScheduledThreadPool()

例如我们可以使用它们,如

ExecutorService fixedThreadPool() = Executors.newFixedThreadPool(4);

Future<T> future1 = singleThreadPool.submit(new MyRunnable());

singleThreadPool.execute(new MyRunnable);

singleThreadPool.shutdown();

,这可能是在现实实践中。