我正在处理本质上(谁,在哪里,多少)的大量记录(CDRS),以节省空间,我使用查找将字符串映射为整数并将流量聚集在map上(谁映射到地图(其中映射了多少)
type CDR = (String, String, Int)
type Lookup = scala.collection.mutable.HashMap[String, (Int, Float)]
type Traffic = scala.collection.mutable.HashMap[Int,scala.collection.mutable.HashMap[Int,Int]]enter code here
我发现了一个奇怪的行为,当我预先构建查找表时,代码会按预期运行,但是当我开始处理并即时构建地图时,它会在处理记录时变慢。
我使用相同的功能来建立查找表以进行比较。我基本上检查查找代码是否存在,如果没有,则创建一个新条目(它是可变映射),如下所示:
def index(id: String, map: Lookup, reverse: Reverse): Int = {
if (map.contains(id)) {
map(id)._1
} else {
val number = if (map.keys.size == 0) 0 else reverse.keys.max + 1
reverse += ( number -> id)
map += (id -> (number, 0.toFloat))
number
}
}
我在这里错过了什么吗? 编辑---->我不再能重现减速情况。我会认为我比平时太累或太笨了。现在的运行时间似乎与我预期的相同。
答案 0 :(得分:1)
什么是mapCellRvs
?默认标量Map
的{{1}}(和.size
,这是同一件事)只是通过线性扫描所有元素来计数它们。
尝试将.keys.size
替换为mapCellRvs.keys.size == 0
...
此外,mapCellRvs.isEmpty
也是线性的。您可能只想单独记住某个最大值,而不是每次都计算它。