オンメモリ高速KVSをjavaのstatic変数で実現する

やりたいことは、メモリの高速さをフルに活かした超シンプルなKVS。
用途は、機械学習アルゴリズムのモデル用。
・大量のKeyValue値を高速に読み書きできること。
・モデルはシリアライズを使って、ファイルに保存/読み込みもできるようにしたい。
・サーバを再起動したり、しばらく使わないときは、ファイルにしておく。
・モデルを更新したい時もメモリ上のデータに対して高速に操作できる。
そういうシンプルで高速なオンメモリKVSが欲しかった。


しかし、以前にも書いたように、メモリの高速っぷりを活かしたシンプルなKVSはありそうでなかった。
Redisはネットワーク越しに使われることが前提とされているとかなんとかで、その辺りがボトルネックになって素のメモリ処理に比べると桁違いに遅かった。
Tokyo CabinetはTokyo Tyrantと違ってインターナル用途が想定されているものの、レコード数が1億くらいに増えると急に重くなって使い物にならなくなった。(もしかしたらパラメータ調整がんばればいけるかも という印象)

じゃあもういいってことで、pythonの共有メモリを使って実現しようとしたが、子プロセスを管理したりとかいろいろ厄介そうだったのでこれも断念。


で、行き着いたのが、javaのstatic変数。そして、そのデータを使うのもjavaに限定。
同じプロセス内なので、素のメモリ操作と同じレベルの高速性が期待できる。
その代償として、そのデータの使用はすべて同じJAVAアプリケーション内に限られるので、機械学習の計算ロジックなどはすべて同じアプリケーション上に書く。
もはやKVSでもなんでもないわけだが、、

で、それをGlassfishなどのインスタンスとして実現する。
計算結果を返すインターフェイスなんかも用意してあげてAPI化する。


でもやっぱりなんか違和感がある。ただメモリの内容を他のプロセスと共有するだけのことがどうして簡単にできないんだろう