【问题标题】:Java: Need optimzed (fast) method for writing integer array to FileOutputStream [closed]Java:需要优化(快速)方法将整数数组写入 FileOutputStream [关闭]
【发布时间】:2013-11-06 01:50:27
【问题描述】:

搜索会产生许多关于如何将 int 转换为 byte[] 的问题。我有一个带有关键循环的项目,它将长 int [] 写入 FileOutputStream。 FileOutputStream 需要一个 byte[] 来写入。我可以暴力破解不同的方法;我正在寻找一种将 int[] 直接发送到 FileOutputStream 的方法或将 int[] 转换为 byte[] 的最快方法 - 类似于包装缓冲区。我看到了包装 byte[] 以转换为 int[] 和 float[] 的方法......但没有其他方式(从 int[] 到 byte[])。谢谢。

更新:在证明需要之前,仍然希望避免内存映射 I/O 的复杂性(或目前正在试验)。下面的 cmets 促使我考虑创建一个 ByteBuffer,将其包装在一个 IntBuffer 中,将 int 写入 IntBuffer,然后从 ByteBuffer 中提取一个 byte[] 以发送到 FileOutputStream。显而易见的替代方法是直接使用 byte[],这需要我将数据作为字节而不是整数来操作,我可以这样做 - 但与 byte[]/ByteBuffer 相比,它的效率高多少(如果有的话) /IntBuffer 包装方案?

【问题讨论】:

  • 为了澄清,这些是字节值 (0-255),它们被存储为整数。您没有 {0, 100, 1000, 100000} 的数组并想要打印它们。如果是这样,stackoverflow.com/questions/1086054/…
  • 更具体地说,我有 int[14] 并且我想以小端顺序将其写入文件,效率很高。提供的链接采用不同的方法(如果这是最好的方法,我可以使用它 - 但需要更多修改),它以 ByteBuffer 开头,(显然)用 IntBuffer 包装它,将数据(一次一个 int)添加到 IntBuffer ,然后提取一个 byte[] - 供我使用,然后将其写入 FileOutputStream。这是一种有效的方法吗?

标签: java arrays


【解决方案1】:

您的瓶颈很可能是您的磁盘 IO,因此您在 CPU 中的操作无关紧要。我会确保您尝试解决一个会对您的应用程序产生影响的问题。

如果你有一个快速的磁盘子系统并且你有很短的数据突发,那么你的 CPU 可能很重要,并且进行转换的最快方法是首先避免执行转换,即不要使用 @987654321 @ 一点也不。例如,如果 OpenHFT/Java Chronicle 采用 int 值并将其作为 32 位值直接写入内存映射文件内存区域。这意味着每次写入都包含一条机器代码指令,平均耗时约 1.5 ns。

【讨论】:

  • 是的,关于磁盘 I/O 的观点很好,我确实考虑到了这一点。我可能正在编写 100+MB 的文件,除了内存映射 I/O 的基础知识外,我对所有内容都不熟悉。我很高兴开始(直到测量显示需要进一步优化)让 java 处理缓冲 I/O。首先,我希望避免将数据从 int[] 不必要地复制到 byte[] 只是为了将其输出到 FileOutputStream(或其他可能更合适的东西)。
  • @ags 我会首先关注系统中最慢的部分。您可以使用 sun.misc.Unsafe 从int[] 直接复制到byte[],但如果数组足够大,那么您的 L3 缓存到内存带宽将是限制因素,而您的操作方式不会事情。首先创建 byte[] 可能会花费更多。注意:你的 byte[] 必须被复制到本机内存,这就是为什么 Java-Chronicle 直接复制到本机内存以避免所有这些。
【解决方案2】:

试试 ObjectOutputStream.writeObject(intArray)。您可以稍后使用 ObjectIntputStream.readObject 阅读它

【讨论】:

  • 虽然更简单,但这会慢得多,因为它将 int[] 转换为 byte[] 等等。
  • 同意。虽然对于持久存储的异构类型的序列化和以后的反序列化很有用,但我已经测量了在不必要时使用它对性能的显着影响。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-11
  • 1970-01-01
  • 2013-08-26
  • 2014-10-08
  • 1970-01-01
相关资源
最近更新 更多