a3n*_*3nm 5 java performance serialization deserialization
我有一个Java程序,它将数据准备到内存中相当复杂的大数据结构(几GB)并将其序列化到磁盘,另一个程序读取内存中的序列化数据结构.我惊讶地注意到反序列化步骤非常慢,并且它受CPU限制.(100%的CPU使用率,top但只读取3到5 MB/s iotop,这对于硬盘驱动器上的顺序读取来说非常低).CPU是最新的(Core i7-3820),结构适合内存,没有配置交换空间.
为什么会这样?是否有另一种方法可以在Java中序列化没有CPU作为瓶颈的对象?
这是反序列化代码,如果重要的话:
FileInputStream f = new FileInputStream(path);
ObjectInputStream of = new ObjectInputStream(f);
Object obj = of.readObject();
Run Code Online (Sandbox Code Playgroud)
反序列化非常昂贵。如果使用通用反序列化,它将使用大量的反射和对象创建。
有很多更快的替代方案,并且大多数使用生成的代码而不是反射。
http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking
您会注意到最快的方法之一是使用Externalized,这可能是您的一个选择。这意味着添加用于对象序列化和反序列化的自定义方法。
我已经编写了很多最快的方法,但这避免了通过回收它们或就地使用文件中的数据来创建任何对象(即不需要反序列化它们)