2010-04-16 28 views
26

Java是否有(或有可用的庫),允許我有一個基於磁盤的HashMap?它不需要是原子或任何東西,但它將通過多線程訪問,並且不應當在兩個同時訪問相同元素時崩潰。基於磁盤的HashMap

任何人都知道什麼?

+1

什麼是「基於磁盤(哈希)映射」? – Progman 2010-04-16 16:47:05

+0

文件系統,也許? – 2010-04-16 17:04:14

+1

@Progman 類似於python的http://docs.python.org/library/shelve.html#module-shelve模塊就是我正在尋找的東西。 – synic 2010-04-16 17:19:27

回答

10

properties filesBerkeley DB可能是你正在尋找的。 java.util.Properties本身實現了java.util.Map,並提供了從loadstore到文件的方法。 Berkeley DB經常被推薦爲輕量級鍵值對數據存儲。

+0

我認爲屬性將是完美的。我不知道爲什麼我認爲我必須使這個複雜化,呵呵。 – synic 2010-04-16 17:33:06

+1

屬性不是線程安全的,你說你需要。試想兩個線程同時將文件寫入磁盤。 你可以圍繞它編程,或者看看http://ehcache.org/,如果需要的話,它也可以提供更好的性能。 – zockman 2010-04-17 07:44:20

+0

屬性擴展了Hashtable,因此它是線程安全的,只有併發讀取是同步的,因此性能會受到影響。 – javaPhobic 2017-04-21 05:02:50

7

聽起來像你需要一些接近輕量級分貝。你有沒有看過/考慮過Java DB?帶有單個索引表的light db基本上是一個基於磁盤的線程安全哈希映射。

+1

我從一個角度研究了這一點 - 實際上是從哈希映射的思想轉變爲基於磁盤的哈希映射到基本上是基於磁盤的哈希映射的數據庫。有幾個非常好的,你可以包括罐子和使用它,那是5年以前。這裏有一個關於數據庫的很好的討論:http://www.linkedin.com/answers/technology/software-development/TCH_SFT/1207-3692603 – 2010-04-16 17:03:11

+0

我實際上已經在使用sqlite來解決這個問題,但我真正需要的是隻是一個線程安全的字符串鍵/值存儲。 – synic 2010-04-16 17:34:25

4

Project Voldemort也是一個非常快速/可擴展/複製「哈希圖」。它是在LinkedIn使用性能也相當不錯:

從他們的網站引述:

這是我們從 單一的多線程客戶交談 一臺服務器查看吞吐量這裏的「熱「數據 集是在存儲器中提供了性能實驗室人工 重負載下:

讀取:19384請求/秒
寫入:16559請求/秒

7

JDBM2正是你所問的。它提供了一個由磁盤存儲備份的HashMap(以及其他地圖)。它的快速,線程安全和API非常簡單。

+1

我有同樣的問題,JDBM2是完美的解決它。先生非常感謝您! – 2013-02-06 03:43:27

28

創建mapdb

創建mapdb提供併發TreeMap和HashMap的由磁盤存儲或關斷堆存儲器支持。它是一個快速,可擴展且易於使用的嵌入式Java數據庫引擎。它具有諸如事務處理,空間高效序列化,實例緩存和透明壓縮/加密等功能。它還具有出色的性能,只有原生嵌入式數據庫引擎才能相媲美。

http://www.mapdb.org/

jdbm2

嵌入式核心價值的Java數據庫。

https://code.google.com/p/jdbm2/

2

所以今年現在是2016年。如果有人在尋找解決這個問題,我發現從JetBrains公司在Xodus低級別的環境API適用於同樣的目的,利用其computeInTransaction店lambda表達式。

當然,它不像純粹的Map實例那樣光滑,但它適用於我的用例。

另一個最近的選擇是使用H2's MVStore storage engine它做同樣的事情,但我認爲它更適合數據庫本身。

乾杯!

3

Chronicle Map implements ConcurrentMap並通過將其內存映射到磁盤來將數據保存到磁盤。

紀事地圖在概念上非常相似,創建mapdb(提供類似的建設者API和Map接口),但紀事地圖是times faster比創建mapdb並具有更好的併發性(紀事地圖採用高度條紋多層次的自旋鎖)。