用Java将float数组写入文件

用户869525:

我正在读取NetCDF文件,并且想将每个数组读取为float数组,然后将float数组写入新文件。如果我读入float数组,然后遍历数组中的每个元素(使用DataOutputStream),就可以使它工作,但这非常非常慢,我的NetCDF文件超过1GB。

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

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

彼得·劳瑞:

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

您的驱动器速度是多少?比您看到的速度慢多少?

如果您想不做任何处理就测试磁盘速度,那么需要花费多长时间来复制最近未访问的文件(即该文件不在磁盘缓存中),这将使您了解最小延迟可以期望从文件中读取然后写入大多数数据(即不涉及任何处理或Java)


为了任何想知道如何减少循环数据的人的利益,即它不仅会调用为您循环的方法。

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

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

对于小块,这将使用循环,但对于大块,可在操作系统中使用页面映射技巧。在任何情况下,它的执行方式都没有用Java定义,但是它可能是最快的复制数据的方式。

仅当将内存中已存在的文件复制到缓存的文件时,大多数这些技巧才有所不同。一旦从磁盘读取文件,或者文件太大而无法缓存物理磁盘的IO带宽,这才是真正重要的事情。

这是因为CPU可以以6 GB / s的速度将数据复制到主内存,但是只能将60-100 MB / s的数据复制到硬盘驱动器。如果CPU /内存中的副本比可能慢2倍,10倍或50倍,则它将仍在等待磁盘。注意:如果没有缓冲,这是完全可能的,甚至更糟,但是如果您有任何简单的缓冲,则CPU的速度将比磁盘快。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章