首页 > 编程语言 > 详细

Java基础-零拷贝技术应用案例

时间:2018-07-03 11:06:57      阅读:413      评论:0      收藏:0      [点我收藏+]

                  Java基础-零拷贝技术应用案例

                                  作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

 

 

  零拷贝技术在Hadoop生态圈中很多组件得到应用,典型的比如kafka组件,它就很成功的应用了零拷贝技术,那么究竟什么是零拷贝技术呢?以及零拷贝技术和传统的拷贝技术有什么差异呢?还有零拷贝有什么缺陷呢?接下来,本篇博客会跟你一起验证这些问题!

 

一.传统拷贝

1>.Java中的传统拷贝

  答:正常拷贝先将文件从磁盘交换到系统(内核)空间,再从内核空间交换到user空间,再从user空间交换到内核空间,最后从内核空间交换到目的缓冲区.。接下里我们画一幅图来进行解析说明,如下:

 

2>.传统拷贝案例展示

 

 

 

二.零拷贝

1>.什么是零拷贝

  答:零拷贝是直接从磁盘交换到内核空间,从内核空间直接输出到目的缓冲区。  

2>.零拷贝案例展示

 

 

三.测试零拷贝方式和常规拷贝方式性能对比

 

 

四.零拷贝细节

1>.Linux中的零拷贝

 

2>.零拷贝缺陷

  零拷贝也有自己的缺陷,当它拷贝的文件大于2G时,就无法完整实现拷贝过程!比如你拷贝一个4G文件左右,它最终的结果是只能拷贝2G大小的文件。我测试使用CentOS官方镜像进行拷贝!测试代码如下:

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/%E6%95%B0%E6%8D%AE%E5%BA%93%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E7%B2%BE%E9%80%9A/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 package cn.org.yinzhengjie.zeroCopy;
 7 
 8 import java.io.File;
 9 import java.io.FileInputStream;
10 import java.io.FileOutputStream;
11 import java.io.RandomAccessFile;
12 import java.nio.channels.FileChannel;
13 
14 public class Test2 {
15     public static void main(String[] args) throws Exception{
16 //        RandomAccessFileTest();
17         ZeroCopy();
18     }
19 
20 
21     public static void RandomAccessFileTest() throws Exception{
22         long start = System.currentTimeMillis();
23         File input = new File("D:\\VMwareworkStation\\ISO\\CentOS-7-x86_64-DVD-1511.iso");
24         File output = new File("D:\\BigData\\JavaSE\\yinzhengjieData\\yinzhengjie_CentOS7.iso");
25         RandomAccessFile rafRead = new RandomAccessFile(input,"rw");
26         RandomAccessFile rafWrite = new RandomAccessFile(output,"rw");
27 
28         byte[] buf = new byte[1024];
29 
30         int len ;
31         while ((len = rafRead.read(buf)) != -1 ){
32             rafWrite.write(buf,0,len);
33         }
34 
35         rafRead.close();
36         rafWrite.close();
37 
38         long end = System.currentTimeMillis();
39         System.out.println("RandomAccessFile 用时为:" + (end - start));
40     }
41 
42 
43     public static void ZeroCopy() throws Exception {
44         long start = System.currentTimeMillis();
45 
46         File input = new File("D:\\VMwareworkStation\\ISO\\CentOS-7-x86_64-DVD-1511.iso") ;
47         //文件输出
48         FileInputStream fis = new FileInputStream(input);
49         //源文件通道
50         FileChannel srcFC = fis.getChannel();
51         //输出流
52         FileOutputStream fos = new FileOutputStream("D:\\BigData\\JavaSE\\yinzhengjieData\\yinzhengjie_CentOS7_1.iso");
53         //输出文件通道
54         FileChannel destFC = fos.getChannel();
55         srcFC.transferTo(0 , input.length() , destFC) ;
56         System.out.println(System.currentTimeMillis() - start);
57         long end = System.currentTimeMillis();
58         System.out.println("ZeroCopy 用时为:" + (end - start));
59     }
60 }
61 
62 
63 /*
64 RandomAccessFile 用时为:46436
65 ZeroCopy 用时为:1275
66 
67  */

  以上代码执行结果如下:(数据并没有完整拷贝!!!)

技术分享图片

 

Java基础-零拷贝技术应用案例

原文:https://www.cnblogs.com/yinzhengjie/p/9256775.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!