私は380,000エントリのデータベースにアクセスする必要があります。私はDBへの書き込みアクセスを持っていない、私はそれを読むことができます。私はfirstnameでユーザーを検索するためにマップを使って検索機能を作った。 1 - DBのすべてをロードする 2 - すべてをMap<Charactere, ArrayList<User>>
に保存します。アルファ文字を使用して、ファーストネームの最初の文字に従ってユーザーを格納します。あまりにも多くのメモリを使用せずに検索キャッシュを高速化
<A> {Alba, jessica, Alliah jane, etc ...}
<B> {Birsmben bani, etc ...}
誰かがユーザーを検索すると、私はすべてのユーザーを見つけるために、ArrayListの上で反復その後、FIRSTNAMEのfirstletterがタイプ取るとmap.get(firstletter)
を使用しています。
地図私は推測するメモリ(380,000ユーザオブジェクト)に大きなスペースをとります。私はヒープサイズを大きくしなければならなかった 私はそれをより速くしたいです。より速くするために、firstnameをキーのキーとして使用します(同じファーストネームを持つ多くの人がいます)。
1 - Still use a map with firstname as key (increasing the heap size again?)
2 - Use files on the disk instead of Map (Alba.dat will contain all Alba for example) and open the right file for each search. No need to incease the heap size, but are there any side effects?
より良いものです:
私は2つの心の中で解決策を持っていますか? (長所と短所)
Update with more info
これは電話で私たちの顧客サービスを呼び出す顧客のデータベースです。電話を受ける人は、顧客名(通常は名字と姓)を使用して検索する必要があります。 Dbを使用すると検索が遅すぎます。私が実装した解決策は既にかなり速いです(dbを使って1/2秒対26秒)が、それを改善したいのです。
一度読み込まれたデータが他の誰かによってデータベース内で変更されることはないと想定していますか?なぜ、最も多く使用されているデータではなく、完全なデータをキャッシュする必要がありますか?問題のドメインについて説明してください。データベース全体のコピーをメモリに保持する必要があるのはなぜか分かりません。もしそうなら、インメモリデータベースの使用を検討しましたか? –
5分ごとにキャッシュをリフレッシュします。それは顧客の基盤であり、どの名前が最も頻繁に検索されているのかわかりません。 DBのコピー全体を維持する必要はなく、ユーザーのコピー(ファーストネーム、ラストネーム、ID、ドキュメントのリスト) – Rony
そのデータベースに最後に変更された列はありますか? 5分ごとに380Kレコードを取得するのは非常に高価になります。 –