我需要存储一个包含自然语言单词的大型词典——最多 120,000 个,具体取决于语言。这些需要保存在内存中,因为分析表明,利用数组的算法是系统中的时间瓶颈。(它本质上是一种拼写检查/自动更正算法,尽管细节并不重要。)在具有 16MB 内存的 Android 设备上,与 Java 相关的内存开销String
导致我们空间不足。请注意,每个String
都有一个38 字节的开销与之相关,这最多会产生 5MB 的开销。
乍一看,一种选择是char[]
替换String
. (甚至byte[]
,因为 UTF-8 在这种情况下更紧凑。)但是,内存开销也是一个问题:每个 Java 数组都有 32 字节的开销。
等的一种替代方法ArrayList<String>
是创建一个具有几乎相同接口的类,该接口在内部将所有字符串连接成一个巨大的字符串,例如表示为单个byte[]
,然后将偏移存储到那个巨大的字符串中。每个偏移量将占用 4 个字节,从而提供更节省空间的解决方案。
我的问题是 a) 是否有任何其他解决方案可以以同样低的开销* 和 b) 是否有现成的解决方案?搜索Guava、trove和PCJ集合库一无所获。
*我知道可以将开销降低到 4 字节以下,但收益会递减。
注意。支持在 HotSpot JVM 中删除压缩字符串?表明 JVM 选项-XX:+UseCompressedStrings
在这里没有帮助。