2013-02-09 4 views
3

У меня есть большая карта, которая не поместится в памяти, и поэтому я хочу, чтобы она жила на диске. У меня есть следующие варианты:Scala disk based Map

  1. Используйте чистую библиотеку Java, как MapDB: Это работает, но я не получаю Scala коллекции сахара, как getOrElseUpdate и ++= и apply/update методов. Я мог бы создать свой собственный класс-оболочку около MapDB в Scala, но я действительно не хочу вручную реализовывать все свойства Map.
  2. Используйте что-то вроде redis/memcached: я не смог найти хорошую библиотеку scala, которая дала мне Map черт для redis или memcached. Это может быть лучшим решением производительности, но он представляет сложность запуска БД

Так есть ли хороший Scala только библиотека, которая реализует сахар коллекции Scala для карт, и все же он падает обратно на диск и/или ключа -значный магазин для больших карт?

+1

Похоже, что реализация расширить [ '' java.util.AbstractMap ] (http://docs.oracle.com/javase/6/docs/api/java/util /AbstractMap.html), который реализует «Map » - похоже, что должна существовать общая оболочка/мост вокруг Java-карты «», которая может быть использована. И, если нельзя использовать, почему бы и нет? : 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