2013-07-30 4 views
5
に置き換えます。

私は、約1Gのデータを格納するハッシュマップをキー値のペアという用語です。このハッシュマップは15日ごとに変更されます。それはメモリにロードされ、そこから使用されます。大きなハッシュマップをAS

新しいハッシュマップをメモリにロードする必要がある場合、メモリ内のハッシュマップにすでにアクセスしているトランザクションがいくつかあります。古いハッシュマップにアクセスしている現在のトランザクションに影響を与えずに、古いハッシュマップを新しいハッシュマップで置き換えるにはどうすればよいですか?メモリにハッシュマップをホットスワップする方法があれば?

+0

問題が解決した場合は、[回答を受け入れる]べきです(http://meta.stackexchange.com/q/5234/133242) –

答えて

3

マップに直接(ハード)参照を公開するのではなく、​​を使用してください。地図の消費者は#get()を使用し、マップを取り替える準備ができたら、「内部」コードは#set()または#getAndSet()を使用します。

+0

または、マップに揮発性のマークを付けるだけで、コードを変更する – assylias

+0

ConcurrentHashMapは私の問題を解決しますか? – Abhi

+0

いいえ、古いハッシュマップにアクセスするトランザクションを処理せずに、ハッシュマップを_replace_したいとしているからです。 –

0

あなたのようにデータサイズが大きい場合は、memcachedのようなキャッシュツールを使用することをお勧めします。このようにして、個々のアイテムやキャッシュ全体を要件ごとに無効化することができます。

+0

これは、OPの質問とは正反対です。 –

+0

マップは別のソリューションからシリアル化されたJavaオブジェクトとして取得するものであるため、インメモリソリューションを使用する必要があります。 – Abhi

1
  1. を移入し、新しいものを作成し、マップ
  2. マーク・マップを更新する場合
  3. マッププライベートおよび揮発性にゲッターを提供し、それは準備ができたとき、あなたのプライベートマップ変数に割り当てます。

参照割り当てはJavaでは不可分であり、volatileは可視性を保証します。

警告:

  • いくつかのコードは、それが古いデータにアクセスする古いマップへの参照を保持している場合、あなたはいくつかの段階
  • でメモリ内の二つのマップを持っています。それが問題の場合は、ユーザーが常に最新の地図にアクセスできるように、地図を完全に非表示にしてget(K key)を入力してください。
+0

ConcurrentHashMapは、問題をvolatileとしてマークする必要なく問題を解決しますか? – Abhi