我试图在内存中保存由以下模式标识的一组数据结构。我有一个粗略的解决方案,但我正在寻找一些更好的想法。性能和可靠性是至关重要的,内存(在合理范围内)并不是很重要,因为表相当小(最多几百个条目,更可能是几十个条目)。我想,我不想为这么小的数据集使用内存中的DB。
我想要实现的是能够快速查询基于A.Name的所有B条目、基于B.Name的所有A条目或基于T.Tag的所有A条目(我目前并不需要基于T.Tag的所有B条目,但将来可能会有用)
目前,我使用三个具有重复数据的表,以及由此带来的同步问题,当我有了一个新的数据时,我会以三种不同的方式存储它。我相信一定有更好的办法。
// all A entries matching a tag
val Tag2A= new MutableHashMap[String, MutableSet[String]]() with MutableMultiMap[String, String]
// all B entries matching a tag
val Tag2B = new MutableHashMap[String, MutableSet[List[Int]]]() with MutableMultiMap[String, List[Int]]
// all Tags matching a A entry
val A2Tag = new MutableHashMap[String, MutableSet[String]]() with MutableMultiMap[String, String]
有人能推荐一个更优雅的解决方案吗?
编辑:(澄清)我的MutableMultiMap和MutableSet只是导入时的mutable.MultiMap和mutable.Set。
EDIT2:表需要修改(添加/删除)。
发布于 2015-10-02 23:05:57
假设您可以将所有内容加载到内存中,则不可变的解决方案是可以接受的:
abstract class A2B(tag: String) {
def aMap: Map[String, A]
def bMap: Map[String, B]
}
case class A(id: String, name: String, tag: A2B, payload: String)
case class B(id: String, name: String, tag: A2B, payload: List[Int])
您可以这样初始化它(以解决chicken-egg problem):
def getA2b(name: String): A2B = new A2B(name) {
val aMap = { //you can query your external data source tableA here
val a1 = "a1" -> A("a1", "a1", this, "aaaa")
val a2 = "a2" -> A("a2", "a2", this, "aaaa")
Map(a1, a2)
}
val bMap = { //you can query your external data source tableB here
val b1 = "b1" -> B("b1", "b1", this, Nil)
val b2 = "b2" -> B("b2", "b2", this, Nil)
Map(b1, b2)
}
override def toString = name
}
val a2b = Map("a2b1" -> getA2b("a2b1")) //you can query your external data source tableA2B here
和具有常量访问时间的查询(抱歉,当前机器上还没有Scala ):
println(a2b("a2b1"))
println(a2b("a2b1").aMap)
println(a2b("a2b1").aMap("a1").tag.bMap)
a2b1
Map(a1 -> A(a1,a1,a2b1,aaaa), a2 -> A(a2,a2,a2b1,aaaa))
Map(b1 -> B(b1,b1,a2b1,List()), b2 -> B(b2,b2,a2b1,List()))
这里的所有关系都是用链接建模的,所以没有开销。这个结构是不可变的,所以它是线程安全的。您还可以注意到,A2B类在构造函数中被初始化(默认情况下所有的A2B都是最终的),因此根据JSR-133没有同步问题--您的应用程序总是看到A2B的最终版本,因此不需要挥发。
https://stackoverflow.com/questions/32914236
复制相似问题