`
guoyiqi
  • 浏览: 958656 次
社区版块
存档分类
最新评论

寻找最快的大文件拷贝方法(转自:http://www.cnblogs.com/hesicong/archive/2007/08/18/860763.html)

 
阅读更多
众所周知微软的操作系统自带的拷贝是很“弱智”的,速度不高,无断点续传,而且拷贝会拖累其他的应用程序,占用大量的文件缓存。所以很多高级的拷贝工具孕育而生,用过最好的是FastCopy。FastCopy的拷贝速度基本上可以达到磁盘的极限,还因为他开源,所以可以看到其实现。但是很可惜他的工程是VC6的,而且源代码注释都是日文的,不仅如此,其源代码风格很让人迷惑。证实了我的那句话:开源软件的最高境界就是,我开源了,你看不懂;等你看懂了,已经过时了。
  要达到最快的拷贝速度和减少对内存的占用,需要对拷贝的过程有一个了解。拷贝无非就是将文件的数据读出来,然后再写进去的一个过程。XP操作系统自带的拷贝工具会首先打开文件句柄,然后将一块数据读取到缓存中,然后再写入到磁盘中。打开“Windows任务管理器”,进程,查看,选择列,打开I/O读取字节,I/O写入字节。拷贝一个文件,注意explorer.exe进程即可看到整个读写过程。基本上可以看到XP对于文件拷贝几乎是属于同时进行的,换句话说其开的缓存比较小,但其效率可能并不见得很高。在我的200G Seagate 7200.8硬盘上,复制速度在15M/s左右。而这个硬盘的平均读取速度在40M/s,平均写入速度也在35M/s以上。
  在Vista下面文件拷贝做了一些优化,虽然一些BUG导致复制小文件会感觉很慢,但是复制大文件的思路已经不同于XP了。还是打开任务管理器,进行同样的操作。会发现Vista的会读取将近100M后,再将文件写入磁盘。explorer.exe进程也会在拷贝的瞬间内存占用飙升到100M以上,我的电脑商测试是120M左右,而复制完成以后内存占用将恢复正常。Vista的状态显示复制速度在18M/s左右。还是没有达到硬盘的极限速度。
观察Vista和XP的拷贝过程可以得出一个结论,Vista试图对磁盘的拷贝做优化了,但是其无论XP的分小块的复制,还是Vista的大缓存大块复制,都不能达到磁盘的最快速度。
  在两个操作系统复制的过程中,你会发现一个有趣的现象。XP的“任务管理器”的“性能”页面种的“物理内存”种的“系统缓存”的值会不断的增大,大到一个值以后就不会在增长。系统缓存主要用于缓存使用过的一些程序的内存、缓存打开并读写过的文件,已达到更快的读写速度。Win32 API的CreateFile函数默认是使用系统缓存的读写,所以简单的用CreateFile打开的文件是要先到系统缓存的。explorer也是这样,所以当你打开了比较多的后台程序,复制完一个大文件以后,再打开这些后台程序就变得十分缓慢,硬盘不停的读取。这是因为文件缓存占用了太多的内存空间的缘故,将一些程序缓存占用了,所以后台程序会变得十分缓慢。Vista下面这种情况要好一些。虽然这样的设计可以加速很多文件操作的应用,但是对于文件拷贝这样的一次性操作,使用系统缓存固然就是浪费资源了。
  我还发现当使用FastCopy的拷贝大文件的时候会出现另一个现象,就是“系统缓存”会骤降,磁盘读写速度基本达到极限。在XP下面能够改善后台程序的性能,因为此时FastCopy使用的是不使用操作系统缓存的读写操作,软件自生打开了一个32M的缓存(可自定义)。Vista下面的行为有些古怪,“系统缓存”也会减少,但是当复制完以后,硬盘会不断的读取,直到达到复制之前的大小,XP无此现象。

那么怎么样才能达到极限速度呢?是需要缓存还是不需要缓存呢?要缓存需要多大的缓存才好呢?为此我做了一个小实验。



整个程序的思路比较简单,打开文件,读取数据到自定义的缓存,然后写入数据,关闭文件。.NET默认的FileStream默认是缓存的读写,而且没有参数指定非缓存的读写。但好在FileStream的一个构造函数能够很方便的传递一个句柄并为之所用。查阅MSDN的SafeFileHandle时发现了CreateFile的用法,只需要传递一个FILE_FLAG_NO_BUFFERING给CreateFile,就可以实现不使用系统缓存的读写。但使用非缓存的读写有一些操作上的限制,详细的可以见MSDN的相关文档。
  运行以上程序,对一个Segate 80G的硬盘的D盘(硬盘自身缓存8M,其拷贝极限速度在26M/s左右)的一个大文件进行复制操作,得到的结果如下:

缓存大小

不使用系统缓存
拷贝速度(MB/s)

使用系统缓存
拷贝速度(MB/s)
1M 11.99 n/a
2M 15.19 n/a
4M 20.42 n/a
8M 23.87 n/a
16M 25.09 n/a
32M 25.93 11.31
64M n/a 15.89
128M n/a 17.02
由于将在程序中将bufferSize设置为64M会导致出现异常,所以64M没有数据。对于使用缓存的拷贝的速度小于32M缓存的读取速度很慢,没有进行更多的测试。
  结果很明显,在同样的自定义缓存大小的同时,不使用系统缓存的拷贝速度明显要高于使用系统缓存的拷贝速度。当不使用系统缓存的拷贝时,当缓存大小等于磁盘物理缓存大小的时候拷贝速度就达到了90%的最大速度;当等于磁盘物理缓存2倍时基本达到磁盘存取极限。由于上述原因,这也就是为什么FastCopy不使用系统缓存的缘故了。
  当然如果大家有什么更好的看法或想法,欢迎留言探讨,谢谢!
分享到:
评论

相关推荐

    sso详细设计说明书(下篇)转载(海纳百川文章http://www.cnblogs.com/David-weihw/a)

    流程图 博文链接:https://cailin.iteye.com/blog/143116

    android IM

    即时通讯相关的资料: ... 成功解决asmack不能收发文件的问题 ...http://www.cnblogs.com/not-code/archive/2011/08/01/2124340.html MTQQ http://www.cnblogs.com/charley_yang/archive/2011/03/27/1997938.html ...

    HSQLDB安装与使用-转自http://www.cnblogs.com/wllyy189/archive/2008/11/15/1334002.html

    NULL 博文链接:https://dins.iteye.com/blog/454304

    android的回调机制(转自http://www.cnblogs.com/vtianyun/archive/2012/06/19/2555427.html)

    NULL 博文链接:https://zhanglimijavaeye.iteye.com/blog/1729615

    Web 断点续传批量上传上传工具

    开发文档-ASP.NET:http://www.cnblogs.com/xproer/archive/2012/02/17/2355469.html 升级日志:http://www.cnblogs.com/xproer/archive/2012/02/17/2355449.html 示例下载:...

    一个牛人提供的GIS源码(很好)

    寻找MapBar的地图切割方法 http://www.cnblogs.com/Tangf/archive/2006/05/28/411397.html ┕我自己切割的Mapbar地图,并且可以在本地运行:http://www.cnblogs.com/Files/Tangf/MapBar_My.rar 已知一点求最近点...

    HttpDownloader-开发文

    产品介绍:http://www.cnblogs.com/xproer/archive/2011/03/26/1996322.html 开发文档:http://www.cnblogs.com/xproer/archive/2011/03/26/1996371.html 升级日志:...

    23种设计模式的java实现

    状态模式 http://www.cnblogs.com/java-my-life/archive/2012/06/08/2538146.html 策略模式 http://www.cnblogs.com/java-my-life/archive/2012/05/10/2491891.html 模板方法模式 ...

    webApi请求插件PostMan

    webApi请求插件PostMan,请参考博客:http://www.cnblogs.com/chenwolong/p/PostMan.html。webApi请求插件PostMan,请参考博客:http://www.cnblogs.com/chenwolong/p/PostMan.html。webApi请求插件PostMan,请参考博客...

    C# 简单的作业调度

    ,C# 简单的作业调度,亦可参考博客:http://www.cnblogs.com/chenwolong/p/Job.html,C# 简单的作业调度,亦可参考博客:http://www.cnblogs.com/chenwolong/p/Job.html,C# 简单的作业调度,亦可参考博客:...

    C# 并发测试

    存储过程版、EF框架版,详情请结合博客:http://www.cnblogs.com/chenwolong/p/BF.html 网址。 C#并发处理。存储过程版、EF框架版,详情请结合博客:http://www.cnblogs.com/chenwolong/p/BF.html 网址。 C#并发...

    JS截屏控件

    产品介绍:http://www.cnblogs.com/xproer/archive/2010/08/09/1796077.html 在线演示-标准版:http://www.ncmem.com/products/screencapture/demo/index.html 在线演示-专业版:...

    libmcrypt-2.5.8.tar.gz/mcrypt-2.6.8.tar.gz/mhash-0.9.9.9.tar.gz

    libmcrypt-2.5.8.tar.gz、mcrypt-2.6.8.tar.gz、mhash-0.9.9.9.tar.gz php安装mcrpyt插件所需的包 安装方法:http://www.cnblogs.com/huangzhen/archive/2012/09/12/2681861.html

    “二维码”QRCode -新版火车票(wm+c#+源码)

    http://www.cnblogs.com/wt0731/archive/2007/08/31/877659.html 下面分享一下在手机上怎么来生成和识别二维码? 下面是一个开源的Open Source QRCode Library:http://www.codeproject.com/KB/cs/qrcode.aspx ...

    谷歌开源的Google Preview Image Extractor.zip

    这个项目可以考虑用在特定情况下加速加载无损格式的预览图,提升用户体验 该项目没有demo代码,demo代码可参考博客园的一位网友的文章:http://www.cnblogs.com/tntmonks/p/5143350.html 标签:无损图片

    MVC5&EF6入门教程_Part3

    转自:http://www.cnblogs.com/miro/p/4030622.html 整理到了doc文档里,内含代码。 方便一起学习。

    Android代码-SmartPopupWindow

    PopupWindow不响应点击外部消失和返回键消失的解决方法博文地址:http://www.cnblogs.com/popfisher/p/5608717.html PopupWindow精确计算要显示位置原理和方法博文地址:...

    开源GIS最著名的地图投影库Proj.4库

    Proj.4的功能主要有经纬度坐标与地理坐标的转换,坐标系的转换,包括基准变换等。 下载也可直接使用git进行下载:git clone ...cmake下载与安装:https://www.cnblogs.com/chenyaling/p/10894084.html

    CKFinder.v2.4.1.完美注册版.ha666.zip

    CKEditor+CKFinder使用与配置:http://www.cnblogs.com/dmeiyang002/p/3808307.html 官网地址:http://ckeditor.com CKEditor下载地址:http://ckeditor.com/download CKFinder(免费版本)下载地址:...

    WindowsMobile 6.5滑动效果

    ... ...[Windows Mobile]Gestures API 擷取使用者的手勢 :http://www.dotblogs.com.tw/chou/archive/2009/08/05/9877.aspx http://www.cnblogs.com/dearsj001 ... login=1#commentform

Global site tag (gtag.js) - Google Analytics