String
高速検索が必要なものがたくさんあります。各文字列は22文字の長さで、最初の12文字(いわば「キー」)によってのみ検索され、文字列の完全なセットが定期的に再作成されます。それらはファイルからロードされ、ファイルが変更されると更新されます。使用可能なメモリが少なすぎるため、VPS上の他のサーバープロセスでもメモリが必要であり、さらに多くのメモリが必要です。
文字列を保存して検索するにはどうすればよいですか?
私の現在のアイデアは、(RAMを節約するために)それらを次々に(RAMを節約するために)格納し、より高速なルックアップのためにソートすることです(バイナリ検索または補間char[]
検索を使用できるように、事前にソートしておくとルックアップが最も速くなると思います)。しかし、私はそれをどのようにコーディングすべきか正確にはわかりません-誰かが挑戦的なパズルの気分になっているなら:ここにあります...
ところで:レクリエーション/並べ替え中にしばらくの間メモリの制約を超えても大丈夫ですが、それほど長くはないはずです。
ありがとう!
アップデート
「詳細を知りたい」群衆の場合(Javaの詳細が間違っている場合は訂正してください):ソースファイルには約320000エントリ(すべてANSIテキスト)が含まれていますが、本当に(WAY!)64MB未満にとどまりたいですRAMの使用量とデータは私のプログラムの一部にすぎません。メモリ内のJavaタイプのサイズに関する情報を次に示します。
私のVPSは32ビットOSなので、...
- 1つ
byte[]
、すべて連結=12+長さバイト - 1つ
char[]
、すべて連結=12+長さ*2バイト String
= 32+長さ*2バイト(オブジェクトであり、char[]
+ 3を持ちますint
)
だから私は記憶に留めておかなければなりません:
- すべてがに保存されている場合は最大7MB
byte[]
- すべてがに保存されている場合は最大14MB
char[]
- すべてがに保存されている場合は最大25MB
String[]
- > HashTable / Mapに保存されている場合は40MB以上(おそらく初期容量を微調整する必要があります)
HashTableは魔法ではありません-挿入に役立ちますが、原則として、hashCodeモジュラス容量がインデックスとして使用される非常に長い文字列の配列であり、データはインデックスの次の空き位置に格納され、線形の場合は検索されますルックアップで見つかりませんでした。ただし、ハッシュテーブルの場合、ルックアップ用に文字列自体と最初の12文字のサブ文字列が必要になります。私はそれを望んでいません(または私はここで何かを逃しますか?)、ごめんなさい人々...