Java:从文件中保存和读取哈希映射

Java:从文件中保存和读取哈希映射,java,hashmap,Java,Hashmap,我有以下嵌套哈希映射: HashMap<Foo1, HashMap<Foo2, TObjectDoubleHashMap<Foo1>>> my_map; HashMap我的地图; TObjectDoubleHashmap中有超过一百万个条目,生成这些条目大约需要一分钟。我有哪些选项可以将它保存到文件中,这样就不必每次都生成它 到目前为止,我已经将实际的键和值保存到一个文本文件中,然后再次将其加载到hashmap中,但这并没有节省那么多时间。有没有更快的方法

我有以下嵌套哈希映射:

HashMap<Foo1, HashMap<Foo2, TObjectDoubleHashMap<Foo1>>> my_map;
HashMap我的地图;
TObjectDoubleHashmap
中有超过一百万个条目,生成这些条目大约需要一分钟。我有哪些选项可以将它保存到文件中,这样就不必每次都生成它

到目前为止,我已经将实际的键和值保存到一个文本文件中,然后再次将其加载到hashmap中,但这并没有节省那么多时间。有没有更快的方法,例如使用序列化将其保存为对象?如果是这样,我必须做什么才能使我的密钥可序列化

有没有更快的方法,例如使用序列化将其保存为对象?

映射的序列化仅仅是写出键和匹配值。使用序列化不会比自己长时间使用更快。HashMap对其序列化数据的描述如下:

HashMap的容量(数据的长度) bucket数组)发出(int),后跟 大小(一个整数,键值的数目) 映射),然后是键(对象)和值(对象) 对于每个键值映射。键值映射是 没有特定的顺序发出

你可以看到代码

我必须做什么才能使我的密钥可序列化?

要使对象可序列化,请实现接口。您可能还需要指定
serialVersionUID
。添加一个字段:

private static final long serialVersionUID = 1L;
您是否使用
映射
,因为您想为每个值使用两个键


如果是这样,您可以尝试使用番石榴而不是嵌套贴图,这可能会提高性能。这是为将两个键关联到一个值而设计的。我的猜测是,创建大量哈希映射占用了大部分初始化时间。

@gewizz嗯,有很多不同的序列化库,您可以使用它们进行研究,例如。我没有经验说他们中是否有人会有帮助,但这可能值得调查。还有一个google小组专门负责对这些不同的库进行基准测试:@PaulBellora:关闭对象引用的编写功能可以让这些其他序列化库获益,这意味着您不必跟踪是否在流中看到了对象。当你开始撞击数以百万计的物体时,这会产生影响。但是,如果有指向同一对象的引用,这是不合适的。@Gregkopf啊,好吧-我对这些库的工作或与标准Java序列化的区别肯定了解得不够,但我只想提及它们的存在。@PaulBellora:是的-这当然值得一看-Kryo还有一个序列化程序,它非常紧凑,没有写出任何对象元数据-但这意味着它不能随着类的变化而变化,您必须注册要序列化的类(它写出一个数字id而不是类名)。这有助于在磁盘/线路上实现高效的表示,但它有点脆弱。这里的Guava团队成员:我不会说使用
Table
可以提高性能。(实际上,在后端,
HashBasedTable
的实现与OP的代码非常相似,带有
HashMap
(使用
Table
不会有什么影响,尤其是wrt的可读性。)