我想了解Scala的哈希函數對於大哈希表的規模有多好(數十億條目,例如用於存儲特定位數的DNA出現)。有趣的是,HashMap和OpenHashMap都忽略了指定初始大小(2.9.2。和2.10.0,最新版本)的參數。Scala:哈希忽略初始大小(數十億條目的快速哈希表)
我認爲這是因爲在第一個800.000左右之後添加新元素變得非常慢。
我已經嘗試增加要插入的字符串中的熵(僅在下面的代碼中使用字符ACGT),而沒有效果。
對此特定問題有何建議?我也希望聽到您對使用Scala內置類型是否是一個擁有數十億條目的散列表的好主意的看法。
import scala.collection.mutable.{ HashMap, OpenHashMap }
import scala.util.Random
object HelloWorld {
def main(args: Array[String]) {
val h = new collection.mutable.HashMap[String, Int] {
override def initialSize = 8388608
}
// val h = new scala.collection.mutable.OpenHashMap[Int,Int](8388608);
for (i <- 0 until 10000000) {
val kMer = genkMer()
if(! h.contains(kMer))
{
h(kMer) = 0;
}
h(kMer) = h(kMer) + 1;
if(i % 100000 == 0)
{
println(h.size);
}
}
println("Exit. Hashmap size:\n");
println(h.size);
}
def genkMer() : String =
{
val nucs = "A" :: "C" :: "G" :: "T" :: Nil
var s:String = "";
val r = new scala.util.Random
val nums = for(i <- 1 to 55 toList) yield r.nextInt(4)
for (i <- 0 until 55) {
s = s + nucs(nums(i))
}
s
}
}
你不打算用完內存嗎? –
32或64位jvm?關於忽略初始大小:它沒有,你可以檢查HashMap的源代碼 – Arjan
感謝您的答案。爲了澄清,這將被部署在具有256G + RAM的機器上。 @Noah:但每次翻倍後都要複製桶內容,對吧?但即使這是真的,它也沒有向我解釋爲什麼在重複800.000次左右之後出現這種性能下降的情況 - 我認爲重新排列後會急劇下降,然後再恢復到全速。 – Alexander