MyException - 我的异常网
当前位置:我的异常网» VC/MFC » 载入文件,请教怎么提速

载入文件,请教怎么提速

www.MyException.Cn  网友分享于:2013-01-15  浏览:10次
载入文件,请问如何提速
就是将一个文件的内容拷贝到另一个文件的指定位置

我现在用内存映射文件的方式,
两个文件分别映射一个内存映射对象
流程大概就是
While{
pSrc=MapViewOfFile()
pDst=MapViewOfFile()
memcpy(pDst,pSrc)
FlushViewOfFile(pDst)
UnmapViewOfFile(pSrc)
UnmapViewOfFile(pSrc)
}
但是觉得好慢,如果不是memcpy而仅仅是memset速度就会提高很多很多
难道时间是在memcpy而不是FlushViewOfFile写回磁盘的时候消耗掉了?

有什么方法提速吗?我现在是每次映射16M,应该是更大一些还是小一些

------解决方案--------------------
感觉不如直接使用写文件writefile来操作。为什么要采用映射的方式呢。
------解决方案--------------------
如果有一个数据对象是在网络上的话,最后不要映射16M这么大,本地的话就无所谓了。
------解决方案--------------------
memset是只写,memcpy是先读后写。文件映射的写操作是一次写入,而读操作是分页来读的,所以memset会比memcpy快很多。
很多人都认为文件映射是访问文件最高效的方法,其实这种观念是错误的,实际应用中真正需要使用文件映射的时候很少。你目前的需求用常规文件操作就可以,每次读写尽量多一些,按目前常见的硬件配置,复制5GB数据最多5分钟。如果用FILE_FLAG_NO_BUFFERING的方式,可以再快一些,不过这种方式用起来不太方便,如果对速度方面要求不是很高一般不用。
------解决方案--------------------
如果是本地拷贝使用不使用内存映射文件没有什么大的意义。

如果是巨大文件的频繁读写,内存映射文件还有许多优点,仅仅拷贝的时候,不管memcpy还是memset都不是速度的瓶颈,文件映射有时感觉非常快,但是那是操作系统还没有将文件刷新到硬盘上,如果你拷贝完数据马上关闭映射内存,时间其实是一样的。甚至在你的进程已经结束很长时间以后,操作系统还在刷新你的数据,这时其实还是在使用你的资源。

另外还要注意到文件存取的性能极限,当每次存取数据的大小接近一定范围时,性能急剧下降。我自己试验后就直接操作文件一部分一部分地读,一部分一部分地写。

实在不行就用两块硬盘做个RAID0吧。 :)




------解决方案--------------------
如果在不更改两个文件大小的情况下
两个文件分布的扇区是没有变化的
中间效率问题和你的文件在磁盘上扇区分布是有很多关系的
如果扇区是连续的那么速度非常快(要配合你读写的大小)
打个比方
文件1 有5个占用5个扇区分别是连续在一起的如:12345,12346,12347,12348,12349这几个扇区.这时你一下把5个扇区一起读了那么系统只需要一次定位就可以把文件所有内存读取了。但是你如果你读取的大小为一个扇区的话虽然扇区是连续的但是也需要定位五次。你再往另一个文件写操作时同理。也要看扇区分布情况和读写大小等因数,如果能直接先获取文件分布图然后根据连续扇区数来分配一次读写的Buffer大下我相信速度应该是最理想的
------解决方案--------------------
内存映射文件要考虑页文件粒度,太不灵活

CreateFile 时指定 FILE_FLAG_SEQUENTIAL_SCAN

const unsigned SIZE = 64MB;
pTmp=new [SIZE] 
while{ 
ReadFile();
WriteFile();
FlushFileBuffers() 

delete[] pTmp 

文章评论

如何成为一名黑客
如何成为一名黑客
 程序员的样子
程序员的样子
鲜为人知的编程真相
鲜为人知的编程真相
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
编程语言是女人
编程语言是女人
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
10个调试和排错的小建议
10个调试和排错的小建议
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
程序员的鄙视链
程序员的鄙视链
我的丈夫是个程序员
我的丈夫是个程序员
老程序员的下场
老程序员的下场
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
旅行,写作,编程
旅行,写作,编程
中美印日四国程序员比较
中美印日四国程序员比较
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
那些争议最大的编程观点
那些争议最大的编程观点
漫画:程序员的工作
漫画:程序员的工作
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
总结2014中国互联网十大段子
总结2014中国互联网十大段子
程序员必看的十大电影
程序员必看的十大电影
为什么程序员都是夜猫子
为什么程序员都是夜猫子
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
程序员都该阅读的书
程序员都该阅读的书
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
程序员和编码员之间的区别
程序员和编码员之间的区别
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
一个程序员的时间管理
一个程序员的时间管理
Java程序员必看电影
Java程序员必看电影
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
我是如何打败拖延症的
我是如何打败拖延症的
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
程序员应该关注的一些事儿
程序员应该关注的一些事儿
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有