ファイルからデータを取得し、後で使用するために保存するアプリケーションがあります。ファイルの各行は 1 つのオブジェクトに対応します。Foo
このオブジェクトには、1 つの文字で構成され、それぞれが異なる. したがって、このデータを次のように保存します。n
Bar
String
Name
Foo extends HashMap<Name, Pair<Bar, Bar>>
whereは、2 つの値を格納し、Pair<A, B>
いくつかのメソッド ( など) を提供する独自のクラスです。equals
hashcode
私が遭遇した問題は、実際には 25kbytes に近いのに、オブジェクトを保存するときn=114
(これはたまたまテストデータの数字です) 、228 バイトを超えないようにする必要があることです。これは、1000 個までのオブジェクトがある場合、228kB ではなく 25MB のメモリが必要であることを意味し、これは実際には受け入れられません。(注: 各オブジェクトのキーは同じです。)Pair
Foo
Foo
Foo
fooOne.keySet().equals(fooTwo.keySet())
アプリケーションのプロファイリングにVisualVMを使用していますFoo
。
Field Type Retained
-
this Foo 24750
...
v table HashMap$Entry[] 24662
v [0] HashMap$Entry 200
v value Pair 156
v first Bar 60
...
> code String 36
v second Bar 60
...
> code String 36
v key Name 72
...
> name String 36
> [1] HashMap$Entry 200
> [2] <HashMap$Entry> -
...
> [233] HashMap$Entry 600
...
> [255] <HashMap$Entry> -
ご覧のとおり、有用な情報はすべて、(私にとって) 役に立たないデータに囲まれています。同じデータを持つより少ない、より大きなオブジェクトがあれば、役に立つ:役に立たない比率が良くなることがわかりますが、これを他の方法で実装する方法がわかりません。これほど便利で使いやすく、データを保存できる方法は他にありますか?
編集
私のアプリケーションは、6000 以上のBar
インスタンス、場合によってはそれ以上のインスタンスまで拡張可能である必要がありFoo
ます。