2010-03-10 69 views
10

由於在事務過程中構建了一些非常大的列表和集合,並且在事務結束時迭代了一次,因此我在Java中的內存不足。是否有任何庫提供Java集合,當集合大小超過給定閾值時,它們可以將可序列化的內容緩存到磁盤?後臺到磁盤的Java集合

+0

不完全是你可能要搜索的東西,看看Hadoop http://hadoop.apache.org/ – saugata 2010-03-10 05:14:51

+1

是否有一個原因,你沒有使用標準的RDBMS呢?從某種角度來看,這是你所問的內容的定義。即使是輕量級的,如h2db,sqlite也可以勝任大多數任務。 – dpb 2010-03-10 05:51:19

回答

4

你可以嘗試像ehcache及其overflowToDisk選項

+0

據我所知,Ehcache沒有從緩存中輪詢(獲取+刪除)元素的邏輯,根據文檔我只看到#get()方法。 也許你知道我該如何使用ehcache實現這樣的功能? – MeetJoeBlack 2017-09-07 13:07:48

4

我不會發布你的示例代碼,因爲它會變得太長,但是這是我以前做過:

  1. 擴展LinkedBlockingQueue
  2. 優先考慮它的offerput, poll,takeremove方法。 示例:如果父類'offer返回false(達到容量),然後我會開始序列化到磁盤。
  3. 同樣,在take的實現中,您檢查內存中是否存在任何當前元素,如果不存在,則開始從磁盤讀取數據(並刪除第一條記錄,因爲它現在駐留在內存中;或者當然也可以分批讀取記錄)。
  4. 將這樣一個隊列的每個實例分配一個文件系統安全標識符,以便我可以使用它爲它創建文件系統安全的文件名。另外,爲了更進一步,我可能會使用當前用戶的主目錄作爲這些隊列被串行化到磁盤上的位置。

通過這種方式,99%的磁盤序列化隊列已準備就緒,您只需將您的額外功能放在恰當的位置即可。你需要仔細閱讀Java的BlockingQueue接口的文檔,但是,值得你花時間,因爲你只會添加你需要的額外少許功能,而不是從頭開始編寫整個東西。

希望這會有所幫助。