存储大型 List<Map<String,String>> 的内存高效方式,其中许多映射条目相同

Memory-efficient way to store large List<Map<String,String>> where many map entries are identical

我正在寻找一种内存高效的方式来存储通常由大约 150000 行 x 200 列组成的表格数据。 单元格值是长度在 0-200 个字符范围内的字符串。

数据行最初是通过从较小的 table 中获取所有可能的行组合生成的。因此,虽然所有行都是唯一的,但列包含相同值的许多副本。 数据不是只读的。某些列(通常是 200 列中的最多 20 列)会更新为依赖于其他列值的值。 table.

中将添加带有计算值的新列(我预计还有 20 个左右)

现有的遗留代码在很大程度上取决于存储在 List 中的数据,共 Map<String, String> 个将列名称映射到单元格值。 但是当前的实现 ArrayList<HashMap<String,String>> 占用了数 GB 的内存。

我尝试对插入 HashMap 的键和值调用 String.intern()。这将内存占用减半。但是,将所有相同的 Map.Entry 保留在周围似乎仍然效率低下。

所以我想知道:您能否建议一种内存效率更高的数据结构以某种方式共享相同的列值,但这样可以让我保持外部 List<Map<String, String>> 接口不变?

我们在 class 路径上已经有 guava,所以使用 guava 的集合没问题。

我发现 GS-Collections 更适合内存效率 Maps/Sets。他们通过在幕后使用一些巧妙的数组技巧来避免存储映射条目对象的大量开销。