2012-04-01 6 views
0

まず、Java HashMap performance optimization/alternativeの前に質問された以下の質問を読んだことを教えてください。私も同様の質問があります。プリミティブ型へのマッピングのためのHashMapへの高速代替手段は何ですか?

私がしたいのは、Stanfordパーサーによって処理されるNew York Timesのテキストから多くの依存関係を取り除いて依存関係を与え、依存関係をスコアとともに、つまり依存関係を2回見ている場合1.

でハッシュマップからスコアをインクリメントしますタスクは、すぐに本当にから始まり、約10秒の文章が、すぐにオフにスケーリングします。私のハッシュマップでは、30,000の文章(各文に10語、各単語に3〜4件の依存語があると仮定しています)は、約300,000件のエントリです。

どのように私は私のハッシュマップのパフォーマンスを向上させることができるのだろうか?どのような種類のハッシュキーを使用できますか?

どうもありがとう Martinos

EDIT 1:[OK]男は、多分私は私の質問が誤って[OK]を言葉で表現

、ほかのバイト配列は、私のプロジェクトではなく、上記の他の人の同様の問題で使用されていません。私はなぜ彼らがそれを使用しているのかわからないので、私は尋ねた。第二に

:私はそれを理解する事が非常に困難になります考慮するとして、コードをポストが、ここではサンプルですません。

文で「私はベッドに行きます」私は依存関係を持っている: (Iを、 AM、-1) (I、行く、-2) (I、へ、-3) (AM、行く、-1) 。 。 。 (to、bed、-1) すべての文(1 000 000文)のこれらの依存関係は、ハッシュマップに格納されます。 もし私が依存関係を2回見たら、私は既存の依存関係の得点を得て1を加えます。

それはかなりです。すべてが順調ですが、ハッシュマップに文章を追加する(または取得)の割合は、この行にスケールダウン: dependancyBank.put(newDependancy、dependancyBank.get(newDependancy)+ 1); 誰でも私にその理由を教えてもらえますか? よろしくです Martinos

+2

もっと多くのコードを表示できたら本当に助けになるでしょう...たとえば、関連するタイプは何ですか? 1秒あたり10文が非常に遅く聞こえる... –

+0

最後に余分な質問を削除することを検討してください、それは関連する質問のコメントとしてより適しています。 – GavinCattell

+0

'' byte [] 'をキーとして使うことはできません。だから、あなたが何を使うことができるのだろうか。 'byte []'はオブジェクトですが、HashMapにプリミティブを置くことはできません(ラッパーを追加することしかできません) –

答えて

3

Troveは、キーまたは値がプリミティブ型の場合に最適化されたハッシュマップを持っています。

しかし、キーの構造とハッシュコードの選択には依然として多くの違いがあります。

ご質問のこの部分は不明です:The task starts off really quickly, about 10 sentences a second but scales off quickly. At 30 000 sentences(which is assuming 10 words in each sentence and about 3-4 dependences for each word which im storing) is about 300 000 entries in my hashmap.。しかし、より大きなデータのパフォーマンスが何であるかは言わないでください。あなたのマップは成長します。これは明らかです。ハッシュマップは理論的にはO(1)ですが、実際には、キャッシュのローカリティが低いために、また再ハッシングによる時折のジャンプのために、サイズによるパフォーマンスの変化が見られます。したがって、put()get()回は一定ではありませんが、依然としてそれに近いはずです。おそらく高速アクセスを保証しない方法でハッシュマップを使用しています。それを反復することによって?その場合、時間とともにサイズが直線的に増加し、アルゴリズムを変更しない限り変更することはできません。

+0

本当に助かりました。 – Martinos

+1

2017年にTroveはサポートされず、多くのバグがありました(いつも持っていました)。 fastutil、Koloboke、Eclipseのコレクションが優れた選択肢です。 – leventov

2

Googleの「fastutil」とは、オブジェクトキーをスコアにマッピングするための優れたソリューションです。

0

グアバのマルチマップを見てください。http://www.coffee-bytes.com/2011/12/22/guava-multimaps基本的にすべてが同じキーにマップされているもののリストを保持するように設計されています。それはあなたの必要性を解決するかもしれません。

0

どのように私は私のハッシュマップのパフォーマンスを向上させることができるのだろうか?

get()またはput()ごとに1マイクロ秒以上かかる場合は、IMHOバグがあります。あなたはなぜそれがそうであるかを決定する必要があります。すべてのオブジェクトが同じhasCodeを持つ最悪の場合でも、パフォーマンスが悪くなることはありません。

私はハッシュキーのどのような種類を使用することができますか?

これは、キーのデータタイプによって異なります。それは何ですか?

最後に、byte [] a = new byte [2]とは何ですか? byte [] b =新しいバイト[3];上記の質問には?

これらはバイトの配列です。ルックアップする値として使用できますが、異なる値のタイプが必要な可能性があります。

0

HashMapには初期容量を入力として持つオーバーロードコンストラクタがあります。表示されるスケールは、ハッシュマップが事実上使用できなくなるリハッシュのためです。再ハッシュが頻繁に発生しないようにするには、より大きな初期容量のHashMapから開始する必要があります。再ハッシングする前にハッシュをロードする割合を示すローディング係数を設定することもできます。

public HashMap(int initialCapacity)

オブジェクトの構築時に初期容量をHashMapに渡します。プログラムの実行中にマップに追加したい要素の数のほぼ2倍の容量を設定することが望ましいです。

関連する問題