2012-08-10 118 views
4

嗨,我自然語言處理的拼寫檢查項目工作的數據和我應該從它的大小爲 6.2 MB 1 GB的文件中讀取數據。雖然工作正常,但我面臨的問題是每次運行java程序時都必須將數據加載到內存中,並且每次運行時都要花費相同的時間。緩存內存中的一個大文件的java中

有什麼辦法可以將這些數據緩存到java的內存中嗎?任何人都可以建議我解決一些問題嗎?

基本上我想知道的是,什麼是存儲在內存中的大文件的內容,使我沒有讀一遍的程序?可以說文件是GB的。

+0

如果它是相同的文件,你能產生某種索引並將其存儲在文件中? – MadProgrammer 2012-08-10 07:54:16

+0

你希望你的程序停止時你的數據會留在內存中嗎?請添加一些行以清楚您想要的內容。似乎我不明白你的權利。 – 2012-08-10 07:58:22

+1

您是否試圖剖析您的代碼,以查看是否有任何瓶頸解析文件? – posdef 2012-08-10 08:20:41

回答

2

我在這裏看到了數據的加載/解析從文件和創建緩存引起你一些時間延遲,你想從這個每次都這樣做節省了時間。

在這種情況下,我會建議你使用EHcache。 EHcache(它是開源和Apache許可的ofcource)將爲您保留cahce,防止您的應用程序出現內存不足錯誤,並將cahce的狀態保存到磁盤。

所以,您的應用程序的下一次啓動,你可以直接從EHcahce數據文件引導配置你的應用程序,所以這樣你將避免一次又一次地解析您的文件。

您仍然可以加載您使用的任何cahce到內存中,只有不同之處在於通過EHCache API加載它。

+0

如果加載文件是性能問題,我不會將其存儲在不可預知的弱緩存中。要麼有足夠的內存來緩存文件,要麼沒有。 EHcache對於這個問題只是矯枉過正;只需確保您啓動虛擬機具有足夠的堆空間。 – Cephalopod 2012-08-10 08:21:48

+0

爲什麼EHCache過度殺傷?我也將它用於緩存目的,因爲它也可以存儲在文件中。 – 2012-08-11 02:01:26

4

6.2 MB不是很大,除非這個花費很長的時間,你不能使用一個後臺線程加載該文件,我不會擔心。

您可以使用內存映射文件,但這些並不像使用那麼簡單。如果您有1 GB到1 TB的數據,則內存映射文件很有用。

5

6.2 MB的數據可能會被存儲在您的操作系統的緩存,因爲它是數據的相對較少,因此不應該花太多時間在所有負載。您應該調查是否需要花費很長時間解析此數據,並且可能會將解析的數據緩存到二進制文件以便快速加載。

1

如果您打算編寫/調試您的程序,並且似乎爲每次更改重新加載資源需要太多時間,那麼請考慮JRebel Social(如果這是一個非商業項目,或者JRebel如果是)。它允許您修復代碼中的錯誤或做一些更改而無需重新啓動虛擬機,因此您可以保留已加載的數據(例如存儲在靜態變量中),而無需使用任何緩存,甚至不必重新啓動虛擬機。看到我以前的問題:Loading Resources Once in Java。但是如果它是用於生產的,而且你的意圖是節省內存而不是節省加載時間(在大多數情況下這只是在啓動時纔會受到限制),那麼EhCache或其他緩存庫就足夠了。