2013-02-09 65 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