在Java中将浮点数组写入文件

use*_*525 5 java arrays floating-point netcdf

我正在读取 NetCDF 文件,我想将每个数组作为浮点数组读取,然后将浮点数组写入新文件。如果我读取浮点数组,然后迭代数组中的每个元素(使用 DataOutputStream),我可以使其工作,但这非常非常慢,我的 NetCDF 文件超过 1GB。

我尝试使用 ObjectOutputStream,但这会写入额外的信息字节。

所以,回顾一下。1. 打开 NetCDF 文件 2. 从 NetCDF 文件读取浮点数组 x 3. 将浮点数组 x 一步写入原始数据文件 4. 使用 x+1 重复步骤 2

Pet*_*rey 3

好的,您有 1 GB 可供读取,1 GB 可供写入。根据您的硬盘驱动器,您可能会获得大约 100 MB/秒的读取速度和 60 MB/秒的写入速度。这意味着读取和写入大约需要 27 秒。

您的驾驶速度是多少?您看到的速度比这个速度慢多少?

如果您想在不进行任何处理的情况下测试磁盘速度,请计算复制最近未访问过的文件(即不在磁盘缓存中)所需的时间,这将使您了解您的最小延迟可以预期读取然后写入文件中的大部分数据(即不涉及任何处理或 Java)


为了任何想知道如何进行无循环数据复制的人的利益,即它不只是调用为您循环的方法。

FloatBuffer src = // readable memory mapped file.
FloatByffer dest = // writeable memory mapped file.
src.position(start);
src.limit(end);
dest.put(src);
Run Code Online (Sandbox Code Playgroud)

如果您有混合类型的数据,则可以使用 ByteBuffer,它理论上一次复制一个字节,但实际上可以使用 long 或更宽的类型一次复制 8 个或更多字节。即CPU 能做什么。

对于小块,这将使用循环,但对于大块,它可以使用操作系统中的页面映射技巧。无论如何,Java 中没有定义它是如何实现的,但它可能是复制数据的最快方法。

大多数这些技巧只有在将内存中已有的文件复制到缓存文件时才会产生影响。一旦您从磁盘读取文件或文件太大而无法缓存,物理磁盘的 IO 带宽就是唯一真正重要的事情。

这是因为 CPU 可以以 6 GB/s 的速度将数据复制到主内存,但只能以 60-100 MB/s 的速度复制到硬​​盘。如果 CPU/内存中的副本比实际速度慢 2 倍、10 倍或 50 倍,它仍然会等待磁盘。注意:如果没有缓冲,这是完全可能的,而且更糟,但只要有任何简单的缓冲,CPU 将比磁盘更快。

  • 这是您已经测量过并且可以看到差异的东西,还是您只是“知道”的东西,因为您永远不会错。;) 换句话说,给我一些数字。我有两个高性能 SSD 驱动器,我可以用 Java 测量它们的性能,这不是瓶颈。 (2认同)