Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java NIO读取和写入大型文件(>;1Gb)是否合适?_Java_Performance_Nio_Large Files_Memory Efficient - Fatal编程技术网

使用Java NIO读取和写入大型文件(>;1Gb)是否合适?

使用Java NIO读取和写入大型文件(>;1Gb)是否合适?,java,performance,nio,large-files,memory-efficient,Java,Performance,Nio,Large Files,Memory Efficient,我正在尝试将一个大型文件(通常每个事务中超过1GB的文件)读写到另一个存储位置。在性能和低内存(防止任何OOM情况)方面,通过将文件写入另一个存储位置来传输文件最有效的方法是什么 与传统的Java IO相比,我看到Java NIO是一种更有效的方法,但它真的适合我的用例吗?它会是一种过度的杀伤力吗?我尝试过复制这种大小(1GB)的大型文件。所花费的时间更多地取决于底层硬件和网络状态,而不是JavaNIO本身。作为我刚才尝试的一个简单示例,复制一个989M的文件需要以下平均时间 注意:当文件已经存

我正在尝试将一个大型文件(通常每个事务中超过1GB的文件)读写到另一个存储位置。在性能和低内存(防止任何OOM情况)方面,通过将文件写入另一个存储位置来传输文件最有效的方法是什么


与传统的Java IO相比,我看到Java NIO是一种更有效的方法,但它真的适合我的用例吗?它会是一种过度的杀伤力吗?

我尝试过复制这种大小(1GB)的大型文件。所花费的时间更多地取决于底层硬件和网络状态,而不是JavaNIO本身。作为我刚才尝试的一个简单示例,复制一个989M的文件需要以下平均时间

注意:当文件已经存在并且需要替换时,没有太大区别

  • 从SSD文件夹到SSD文件夹:4ms
  • 从SSD文件夹到HDD(5400rpm)文件夹:~7ms
  • 从HDD(5400rpm)文件夹到SSD文件夹:4ms
  • 从HDD(5400rpm)文件夹到HDD(5400rpm)文件夹:~7ms
  • 我观察到以下情况:

  • 这种解读并没有造成太大的差异
  • 用新内容替换现有文件不会造成太大差异
  • 基于硬盘的写入存在差异

  • 当我们在网络驱动器上运行测试时,我确信由于网络变量,会有很大的变化。

    可能适合您的需要。java.nio.files.File有一个copy()方法-看看如果我对大于1 gb的大文件使用映射内存缓冲区,它会使用太多内存吗?对不起,但我不知道术语“映射内存缓冲区”是什么意思。你能解释一下吗?我不擅长从技术上解释。此链接解释了映射的内存缓冲区@WillsSet OK。我理解。我认为您在这里提到的用例(复制文件)不需要使用
    FileChannel.map()
    (这是内存映射的实现)。内存映射,虽然我只是很少使用它,但对于频繁、多次读取或写入大型文件的情况似乎很好。例如,搜索引擎ApacheLucene所做的。它多次操作和读取索引文件(或目录)的各个部分。我不确定一次性复印是否需要它。不过,让我们看看是否还有其他评论。