【发布时间】:2012-04-10 15:18:17
【问题描述】:
我有一个 Java 程序,它将数据准备成内存中相当复杂和大的数据结构(几 GB)并将其序列化到磁盘,以及另一个程序读取内存中的序列化数据结构。我惊讶地注意到反序列化步骤非常慢,而且它受 CPU 限制。 (top 中的 CPU 使用率为 100%,但使用iotop 读取的速度仅为 3 到 5 MB/s,这对于硬盘驱动器上的顺序读取来说非常低)。 CPU 相当新(Core i7-3820),结构适合内存,未配置交换空间。
为什么会这样?是否有另一种方法可以在没有 CPU 瓶颈的 Java 中序列化对象?
这是反序列化代码,以防万一:
FileInputStream f = new FileInputStream(path);
ObjectInputStream of = new ObjectInputStream(f);
Object obj = of.readObject();
【问题讨论】:
-
IIRC 它使用的反射魔法可与 .NET 序列化程序的工作方式相媲美。那很慢。有一种概念上简单但“大量输入”的方法可以避免所有这些 - 手动完成。也就是说,逐个字段递归地将对象写入二进制流。加载则相反。
-
这可能会有所帮助:vanillajava.blogspot.co.uk/2011/10/…
-
你可以尝试用
BufferedInputStream包裹FileInputStream吗?
标签: java performance serialization deserialization