Java:将大量数据序列化为单个文件

Java:将大量数据序列化为单个文件,java,serialization,Java,Serialization,我需要将小对象的大量数据(大约2gigs)序列化到单个文件中,以便稍后由另一个Java进程处理。表现有点重要。有人能提出一个好的方法来实现这一点吗?你看过谷歌的吗?听起来像是它的一个用例。您尝试过java序列化吗?你可以用A写出来,然后用A读回。当然,这些课程必须是免费的。这将是一个低成本的解决方案,因为对象是二进制存储的,它将是紧凑和快速的。 你可能应该考虑一个数据库解决方案——所有的数据库都在优化它们的信息,如果你使用Hibernate,你就保留你的对象模型,甚至不考虑你的DB。(我相信这就

我需要将小对象的大量数据(大约2gigs)序列化到单个文件中,以便稍后由另一个Java进程处理。表现有点重要。有人能提出一个好的方法来实现这一点吗?

你看过谷歌的吗?听起来像是它的一个用例。

您尝试过java序列化吗?你可以用A写出来,然后用A读回。当然,这些课程必须是免费的。这将是一个低成本的解决方案,因为对象是二进制存储的,它将是紧凑和快速的。

你可能应该考虑一个数据库解决方案——所有的数据库都在优化它们的信息,如果你使用Hibernate,你就保留你的对象模型,甚至不考虑你的DB。(我相信这就是为什么它被称为hibernate,只需存储数据,然后将其带回来)

我马上想到的一个最简单的方法是使用NIO的内存映射缓冲区(java.NIO.MappedByteBuffer)与一个对象的大小相对应,并在必要时将其刷新/附加到输出文件中。内存映射缓冲区非常有效。

协议缓冲区:有意义。以下是他们wiki的摘录:

速度越来越快

默认情况下,协议缓冲区编译器通过使用反射来实现大多数功能(例如解析和序列化),尝试生成较小的文件。但是,编译器还可以生成针对您的消息类型进行显式优化的代码,通常可以提供一个数量级的性能提升,但也可以将代码的大小增加一倍。如果分析显示您的应用程序在协议缓冲区库中花费了大量时间,您应该尝试更改优化模式。只需添加在.proto文件中添加以下行:

选项optimize_for=速度


重新运行协议编译器,它将生成极快的解析、序列化和其他代码。

如果性能非常重要,那么您需要自己编写。您应该使用紧凑的二进制格式。因为对于2 GB,磁盘I/O操作非常重要。如果您使用任何人类可读的格式,如XML或其他脚本,您可以使用2或更大的系数调整数据

根据数据的不同,如果以较低的压缩率动态压缩数据,则可以加快速度


Java序列化是完全不可能的,因为在阅读Java时,请检查每个对象是否是对现有对象的引用。

我不知道为什么Java序列化被否决,它是一种完全可行的机制

从最初的帖子中还不清楚,但是所有2G的数据是同时在堆中吗?还是你正在转储其他东西

开箱即用,序列化不是“完美的”解决方案,但如果在对象上实现Externalizable,序列化就可以很好地工作。序列化的巨大开销是确定要编写什么以及如何编写。通过实现Externalizable,您可以不受其控制地做出这些决定,从而获得相当大的性能提升和空间节约

虽然I/O是写入大量数据的主要成本,但转换数据的附带成本也可能非常昂贵。例如,您不希望将所有数字转换为文本,然后再转换回来,最好尽可能以更本机的格式存储它们。ObjectStream具有在Java中读/写本机类型的方法

如果所有数据都设计为加载到单个结构中,那么在实现Externalizable之后,只需执行ObjectOutputStream.writeObject(您的BigDataStructure)

但是,您也可以在结构上迭代,并在各个对象上调用writeObject

无论哪种方式,您都需要一些“objectToFile”例程,可能需要几个。这就是Externalizable提供的有效功能,以及一个框架来遍历您的结构


当然,另一个问题是版本控制等。但是由于您自己实现了所有的序列化例程,因此您也可以完全控制它。

我开发了JOAFIP作为数据库的替代方案。

也可能有用。它被设计为独立于语言的,并且具有用于的绑定


查看。

他们有你的文本预览是有原因的。发布前请先查看。大家好,我误按了“提交”。不,我一点也不想喊:-(如果你提交错误,请删除你的帖子。