怎样保证程序对文件的写入是顺序的
泻药。这个由文件系统抱住,你正常的open()文件然后读写是没办法的。
■网友
自己开发文件系统解决问题。
如果不是你自己开发的文件系统,那就是看这个分区的情况了。因为应用不能接管文件分区的详细使用方法。
应用层面来说,只能是尽可能一次申请足够大的空间,这样系统层会优先分配连续空间。
NTFS 好像有个疏散文件?还是什么名字的文件空间申请方法,这个方法,文件申请的空间会按照总容量去考虑分配,但是文件本身不需要这么大。如果不用这个功能,就是先要弄个大文件占好坑,之后再往里面写数据。
■网友
我猜lz想了解的是文件preallocate预分配吧
■网友
泻药
【怎样保证程序对文件的写入是顺序的】 如果你使用的是OS提供的api写的磁盘,这个是没办法保障的,OS写磁盘的时候是调用的文件系统来处理的,文件系统一般来说有自己的写入策略,一般是找一个连续的空闲的block写,写完一个写下一个,直到下一个block被占用,那么会重新找一片连续block,接着写,多片连续block通过inode(linux下的node节点)的next指针保持上下连接顺序
如果你想保证写入是顺序的,那么你需要直接操作磁盘,而不是文件系统,同时你需要维护当前从盘的数据,写的时候不会覆盖原有的数据
总的来说,为了这个的性能提升去开发这么一个系统是不太划算的,当然Google这么做了,不代表这么做是最合适的;直接换ssd带来的性能提升是这种方式的提升的数百倍
■网友
文件系统不能保证完全的顺序写。假设现在硬盘上全是1m的碎片,你现在想要创建一个10m的文件并想让它在硬盘上占据10m的连续空间是不可能的,文件系统会找到10个1m空闲的磁盘碎片把它们用指针穿起来,合成一个10m空间用来存文件。这样即使是一直执行append操作,文件的刷入也不是按照硬盘的物理顺序写的。一种可行的办法是尽量将需要写入硬盘的数据在内存中准备好,一次性的刷入硬盘,这样文件系统会尽力找一个比较大的连续硬盘空间来存放数据,这样的刷入硬盘操作可能是顺序的
■网友
这种事吧不该你管你就不要管。要相信文件系统和os还有底层硬件会帮你管好这件事的。何况你根本就不知道这些玩意到底写哪去了,你的硬盘如果是raid还大概能猜出来怎么个写法,要是iscsi或者光纤啥的就没处猜去了。咱们还没说云环境呢是不?啥?你就一块硬盘?那担心这个不如换块ssd实惠,ssd寻道时间可以小到几乎忽略不计。
■网友
硬盘存储数据是以扇区(通常为512字节,下文按512算)为单位的,文件实际大小不满512按512算,超过512则分为若干个512。你在Windows右键看文件/文件夹属性的时候会存在“大小”和“占用空间”2个数值,而且后者比前者大。前者是实际大小,后者是占用的扇区大小,因为不满一个扇区也占据一个扇区的空间。为什么要那么设计?如果文件全都按连续的空间存,那么假如一个硬盘被有序地塞满了,删去2个不连续的1G大小的文件,想放一个2G大小的进去,就放不进去了,因为没有连续的2G空间。事实上大于1G的你都放不进去,实际情况比这复杂得多,这就造成了磁盘的严重浪费。正常的策略是尽量连续存,遇到一个已经存了数据的就跳过继续往下找。但同时,一个大文件被分散在各个不连续的扇区里,我如何才能把它按顺序拼起来?磁盘中有块独立的空间叫分区表(不用来存储用户文件,也是硬盘实际可用容量比标称容量小的原因之一),类似于扇区的目录,专门干这件事情。谁来维护这个分区表呢?由操作系统。最后,随着使用时间的增长,大文件存储的扇区势必会越来越分散(因为空闲扇区分散),导致读取变慢,要想办法尽量把扇区合成连续的空间。这就是所谓的“磁盘碎片整理”。以上仅针对机械硬盘
■网友
应用层无法保证,操作系统(确切地说是文件系统)会自动追求。举个栗子,ext2文件系统,它把为可用的块按顺序做一个位图,通过位图查看寻找连续的块。当然,这种努力都是best effort。一个文件系统,只要你会删除文件,就会造成可用空间逐步碎片化。文件系统也可以通过写时碎片整理来达到分配连续块的目的,但那样得不偿失,通常文件体统都不会这样做。倒是可以把碎片整理程序做成后台闲时进程。以上是纯技术探讨。其实这个问题我觉得在现代越来越不那么重要了,因为现在磁盘容量通常很大,小文件(容易完成碎片)根本不占很大比例的容量,因为你没有那么多小文件。大文件通常不会完成严重的碎片。加个小尾巴,欢迎大家关注我的专栏·「现代计算机」- https://zhuanlan.zhihu.com/modern-computing?utm_source=com.android.email\u0026amp;utm_medium=social
推荐阅读
- 聪明人养花,这3种“花”怎样也要养一盆,每年能省不少医药费
- 新疆铁路部门积极应对降雪降温天气保证旅客安全出行
- 互联网怎样解决“家政服务上门速度慢”的问题
- 招聘都要学历,何来程序员不看学历
- 银行系统的研发岗(程序员)是不是很难进(校招)推广到国企的研发岗(程序员)呢
- 怎样看待从1月8号起,QQ钱包开始提现收费
- 银行it人怎样转型
- 汽车|冬天怎样让车内温度快速升高?座椅加热的最佳使用方式二,外循环的作用总结
- 怎样进入通信行业
- 怎样评价扶他柠檬茶的小说《云养汉》的结尾