2017-08-03 73 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();

,這可能是在現實實踐中。

相關問題