質問

私が持っている場合 不変 私が期待するかもしれないマップ(非常に短い期間にわたって - 数秒のように)追加/削除する 数十万人 からのアイテムの標準です HashMap 悪い考え?一度の瞬間のマップの最大サイズがわずか256MBであるように、10秒未満で1GBのデータをマップに渡したいとします。

マップがある種の「歴史」を保持しているという印象を受けますが、私は いつも 最後にアップデートされたテーブルにアクセスしてください(つまり、マップを渡さない)。 Actor 反応内からのみ更新/アクセスされます。

基本的に、このデータ構造は(部分的に)故障している可能性があると思います 問題については、JVMが記憶から外れていることを見ています 短時間で大量のデータを読むとき。

別のマップの実装を使用する方が良いでしょうか。もしそうなら、それは何ですか?

役に立ちましたか?

解決

痛い。なぜ不変のマップを使用する必要があるのですか?貧しいゴミコレクター!不変マップは通常、(ログn)時間に加えて操作あたりの新しいオブジェクト(ログN)を必要とします。または、実際には、上部に可変ハッシュマップとレイヤーのチェンジセットをラップします(物事を遅くし、オブジェクトの作成の数を増やすことができます)。

不変性は素晴らしいですが、これはそれを使用する時のようには見えません。もし私があなただったら、私は固執します scala.collection.mutable.HashMap. 。同時アクセスが必要な場合は、代わりにJava Util.concurrentのアクセスをラップします。

また、JVMの若い世代のサイズを増やしたいと思うかもしれません。 -Xmn1G それ以上(あなたが一緒に走っていると仮定します -Xmx3G)。また、スループット(パラレル)ゴミコレクターを使用します。

他のヒント

それはひどいでしょう。あなたは常に最終的な更新されたテーブルにアクセスしたいと言います、それはあなたがだけ必要とすることを意味します 短命 データ構造、の費用を支払う必要はありません 持続的に データ構造 - 完全に議論の余地のある「スタイルポイント」を獲得するのは、取引時間とメモリのようなものです。あなたは いいえ 盲目的に永続的な構造を使用して、求められていない場合にカルマを構築します。

また、ハッシュテーブルは、永続的にするのが特に難しい構造です。言い換えれば、「非常に遅い」(基本的には、読み取りが大幅に執筆を上回ると使用可能です - そして、あなたは多くの書き込みについて話しているようです)。

ちなみに、a ConcurrentHashMap このデザインでは、マップに1人の俳優からアクセスされることを考えると、意味をなさないでしょう(説明から理解していることです)。

Scalaのいわゆる(*)不変のマップは、Scala 2.7までの基本的な使用を超えて壊れています。私を信頼しないでください、それのためのオープンチケットの数を調べてください。解決策は、「Scala 2.8で他の何かに置き換えられる」(これがそうだった)だけです。

したがって、Scala 2.7.xの不変のマップが必要な場合は、Scala以外のものでそれを探すことをお勧めします。または、代わりにTreeHashmapを使用してください。

(*)Scalaの不変のマップはそれほど不変ではありません。これは内部的に可変データ構造であり、多くの同期が必要です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top