我有一个应用程序,它从文件中获取数据并将其存储以供以后使用。文件中的每一行对应一个对象Foo
,该对象包含由单个字符组成的n
成对对象,每个对象都有一个不同的. 所以我像这样存储这些数据:Bar
String
Name
Foo extends HashMap<Name, Pair<Bar, Bar>>
Pair<A, B>
我自己的类在哪里,它只存储 2 个值并提供一些方法(equals
等hashcode
)。
我遇到的问题是,当我存储n=114
(这恰好是我的测试数据中的数字)Pair
对象时,Foo
它的保留大小应该不超过 228 字节,而实际上它更像是 25kbytes。这意味着当我有大约 1000 个Foo
对象时,我需要 25MB 的内存而不是 228kB,这是不可接受的。(注意:每个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
实例。