私は、Scala のハッシュ関数が大きなハッシュ テーブル (数十億のエントリを含む、たとえば、特定の DNA のビットが出現する頻度を格納するため) に対してどれだけうまくスケールするかを調べようとしています。
ただし、興味深いことに、HashMap と OpenHashMap の両方が、初期サイズを指定するパラメーターを無視しているようです (2.9.2. および 2.10.0、最新ビルド)。
これは、最初の 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
}
}