2013-02-09 79 views
3

我有一張大的映射不適合內存,因此我希望它位於磁盤上。我有以下選擇:基於Scala磁盤的映射

  1. 使用純Java庫一樣MapDB:這工作,但我不明白斯卡拉 收藏糖一樣getOrElseUpdate++=apply/update方法。我可以在斯卡拉的MapDB左右創建我自己的包裝類,但我真的不想手動實現所有Map特徵。
  2. 使用類似redis/memcached的東西:我無法找到一個很好的scala庫,它爲我提供了用於redis或memcached的Map特徵。這可能是更好的性能解決方案,但它引入了一個運行的數據庫的複雜性

那麼,有沒有很好的斯卡拉只實現了地圖斯卡拉收集糖庫,但它倒在磁盤和/或關鍵價值大型地圖存儲?

+1

它看起來像實現延長['java.util.AbstractMap中'](http://docs.oracle.com/javase/6/docs/api/java/util /AbstractMap.html),它實現了'Map ' - 似乎應該有一個圍繞着Java的'Map '的通用包裝器/橋樑,可以使用它。而且,如果一個人不能使用,爲什麼不呢? :D – 2013-02-09 00:20:06

+1

例如看到http://stackoverflow.com/questions/1027868/how-to-convert-from-from-java-util-map-to-a-scala-map – 2013-02-09 00:23:56

+0

這個問題是泛化的:如何訪問'java.util。地圖'as'scala.mutable.Map [K,V]'?我搜索了'java map scala immutable.map',並獲得了http://docs.scala-lang.org/overviews/collections/conversions-between-java-and-scala-collections.html – 2013-02-09 01:37:54

回答

0

值得一提的Chronicle Map:它基本上是同樣的事情創建mapdb(磁盤持續ConcurrentMap實現),但它比much more efficient創建mapdb。

實施例:

val cache: mutable.Map[String, java.util.List[String]] = ChronicleMap 
    .of(classOf[String], classOf[java.util.List]) 
    .averageKey("key") 
    .averageValue(...) 
    .valueMarshaller(ListMarshaller.of(
     CharSequenceBytesReader.INSTANCE, 
     CharSequenceBytesWriter.INSTANCE 
    )) 
    .entries(...) 
    .createPersistedTo(file) 
7

回答我自己的問題

import collection.mutable 
import org.mapdb.DBMaker 
import collection.JavaConversions._ 

val cache: mutable.Map[String, Seq[String]] = DBMaker.newTempHashMap[String, Seq[String]]() 
+0

不應該那就是'val cache:collection.concurrent.Map [String,Seq [String]]'能夠訪問像'putIfAbsent'這樣的併發方法嗎? – nilskp 2013-12-17 12:35:12