在磁盘上给文件快速预留一大片空间
来源:互联网 发布:windows phone 8手机 编辑:程序博客网 时间:2024/06/04 18:46
在有多个线程操作一个磁盘的时候,在创建文件的时候需要先把文件撑大,把空间占住,后续在向文件写入。
windows下:
方法1:SetEndOfFile
方法2:seek到文件大小的位置,然后写入一个0。
linux下:
如果是ext3用:posix_fallocate
如果是ext4用:fallocate
比如迅雷下载,下载开始之前会在磁盘上创建一个与下载文件同样大小的空白的原始文件,然后下载过程中去改写这个文件。如果在生成这个空白的原始文件时,反复调用的WriteFile来写入文件。当文件较大时,无法保证在写这个文件的过程中,系统中有其他进程也向磁盘申请空间,这样还是会造成磁盘碎片问题,该文件的不连续会造成日后对该文件读取的速度降低,但通常不考虑碎片问题。
我实际编程测了一下:
使用CreateFile/SetFilePointer/SetEndOfFile,速度很快,支持大于4GB的文件;
使用CreateFileMapping,速度也很快,但是32位程序下只能是小于2GB的文件,而且占用地址空间了,不过后续的“改写”操作,将更加容易进行了;
使用WriteFile,速度相当慢;
fseek的底层应该跟SetFilePointer是一样的。
最后,我是这样分析的:
使用SetFilePointer和CreateFileMapping,都相当于用户向文件系统申请一大块“逻辑上连续”的磁盘空间,因为该申请的速度很快,所以降低了其他进程与此同时申请的几率,从而降低了碎片程度,但是“物理位置”还是由文件系统决定的,只能说文件系统看到用户申请连续空间后,尽量去满足用户的请求以达到优化的目的,但是不一定最终给出真正物理连续的空间。
以上2种方法,都没有实际往磁盘中写数据,只是记录下簿记信息,因此速度巨快。但是用了WriteFile,就要慢慢的写入磁盘了。
核心代码:
关于这几个API函数的详细说明可以参照MSDN或百度百科。
其中在SetFilePointer中low代表文件大小的低32位,high代表高32位,所以最大可创建2^64大小的文件。
也可以试着使用:
但是只能创建最大2^32的文件
NTFS的试过可以,但FAT32的速度很慢
- 在磁盘上给文件快速预留一大片空间
- C++ 读文件,预留空间
- Hdfs磁盘存储策略和预留空间配置
- 磁盘分区,文件在磁盘上的存储
- 在Free Bsd中映射磁盘服务器上nas空间
- 给磁盘文件排序
- UITextView 文字上留有一大片空白
- 给ASM磁盘组加空间!
- tar 的目标文件和源文件均在磁盘上
- 在win7上利用虚拟磁盘隐藏文件
- 磁盘长时间插在电脑上,造成文件损坏怎么办?
- IO流(一、在磁盘上创建文件)
- 如何给磁盘文件排序
- Unity中快速给Object在屏幕上定位
- linux 这个更新需要花去 118 M 磁盘上总计 /boot 的空间。请在 19.4 M 磁盘上留出 /boot 空间。
- 磁盘管理:在空余的卷组空间VG上划分新的逻辑卷LV
- 磁盘管理:在空余的卷组空间VG上划分新的逻辑卷LV
- 得到磁盘上剩余空间的值
- android.intent.action.DATE_CHANGED不广播的原因
- ios下 协议与类别,用途很多
- xcode 4 制作静态库详解
- ThinkPHP 3.1中的SQL注入漏洞分析----论ThinkPHP 3.1中的半吊子的PDO封装
- find 命令的用法
- 在磁盘上给文件快速预留一大片空间
- linux svn command
- 关于sqlite的特殊字符转义及通配符
- 如何隐藏键盘,当UITextFiled在UITableViewCell中时
- HTML5 Audio/Video 标签,属性,方法,事件汇总
- LYNC2010 升级到2013之拓扑生成器的使用!
- 人脸识别中主要算法的比较(待续)
- 很有意思的oracle if elsif 少个E
- OCP-1Z0-052-V8.02-145题