我必须将一棵巨大的对象树(7,000)序列化到磁盘中。最初,我们将这棵树保存在Kodo的数据库中,但是它将花费数以千计的查询将该树加载到内存中,并且将占用本地Universe可用时间的很大一部分。
我为此尝试了序列化,的确可以提高性能。但是,我觉得可以通过编写自己的自定义序列化代码来改善这一点。我需要尽可能快地加载此序列化对象。
在我的机器上,序列化/反序列化这些对象大约需要15秒。从数据库加载它们时,大约需要40秒钟。
考虑到由于对象在树中,它们相互引用,因此我有什么技巧可以提高性能呢?
一种优化是自定义类描述符,以便将类描述符存储在其他数据库中,并且在对象流中仅通过ID引用它们。这减少了序列化数据所需的空间。例如,请参见类SerialUtil和ClassesTable在一个项目中的工作方式。
将类设置为可外部化而不是可序列化可带来一些性能优势。缺点是它需要大量的手工工作。
然后还有其他序列化库,例如jserial,它可以提供比Java默认序列化更好的性能。另外,如果对象图不包含循环,则可以更快地对其进行序列化,因为序列化程序不需要跟踪所看到的对象(请参阅jserial的FAQ中的 “它是如何工作的?” )。