【问题标题】:Effiecient serialization of native java arrays with java.io使用 java.io 高效序列化原生 java 数组
【发布时间】:2011-09-12 13:52:56
【问题描述】:

我想对 java.io 的高效序列化提出疑问。主要在计算时间方面有效。将 long[]、int[]、short[] 等原生数组序列化和反序列化到磁盘的最快方法是什么?

我的数组大小在 100mb 到 600mb 之间。我能做的当然是将我的 outstream 与 out.writeInt(...) 和 out.readInt(...) 一起使用,但我想必须有一种更快(缓冲?!)的方式,因为我知道我是读取一个完整的数组。

我所知道的是,该框架为我提供了一个可以转换为 InputStream 的 DataInput。其余的由我的框架处理。

提前致谢,

埃斯

【问题讨论】:

  • 外部数据格式是预先指定的还是您可以控制?
  • 您还没有真正定义问题。您能否提供一些性能数据(每秒 I/O)?可能是您获得的任何速度都很好 - 但是如果没有有关您的问题的一些数据,我们怎么知道呢?
  • normalocitY:很抱歉。我没有任何时间,但它们不会有太大用处。 (这里有 SSD,其他人有其他东西等等。)我只是想知道是否有更有效的方法来存储完整的本机 java 数组。 aix:我得到的只是一个输入流,我不知道外部数据格式……这是我的问题。我只是得到一个 DataInput 并想写数组。

标签: java arrays performance serialization native


【解决方案1】:

不幸的是,对于 DataInput 的每种类型只有一种方法可以使用,即 readLong 等。

如果您可以使用内存映射文件和本机字节排序,那将更加高效。

在我之前所做的测试中,使用内存映射的 ByteBuffer(使用本机字节排序)读取 long 比使用 DataInputStream 快 6 倍。

事实上,从 ByteBuffer 解析文本比使用 DataInputStream 读取二进制文件要快。 :P

http://vanillajava.blogspot.com/2011/06/writing-human-readable-data-faster-than.html

【讨论】:

  • 所以没有办法克服这个问题?首先手动将我的whatever[]转换为byte[]然后用write(byte[])写它有意义吗?
  • 如果您的 DataOutput 没有任何缓冲,这将有所帮助。但是我假设你会使用缓冲。
【解决方案2】:

如果您不想坚持使用 Java 序列化,那么对于这个特殊的用例,Ascii 序列化听起来也不错。

确定数据的简单格式,并使用缓冲的写入器/读取器进行序列化/反序列化。我敢打赌,这将比使用 Java 序列化更快。

另外,您获得的额外优势是您可以看到您的序列化数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-04
    • 2012-10-24
    • 2011-10-05
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多