有時候,預分配一定大小的文件,然后用Memory Mapping的方式讀寫它,會得到較高讀寫的性能,和較小的磁盤碎片,當然還有更長的磁盤壽命。因此文件系統的實現最好有優化預分配的版本,而操作系統最好有有關的API。絕大部分文件系統有可能對預分配進行優化。比如FAT,能夠通過直接操作FAT表來使得某個文件獲得指定的大小,而不必瘋狂地往磁盤寫0,不過經過測試,Windows和Linux都不支持相關操作。退一步來說,即使文件系統不支持優化實現,操作系統也可以幫助它實現預分配的操作,只不過是性能比較低,因為需要拼命往磁盤寫0。
好了現在說說Windows的有關實現。
1.調用CreateFile創建一個文件句柄,需要GENERIC_WRITE|GENERIC_READ權限。
2.調用SetFilePointer設置此文件的當前位置,位置與相對于文件開頭,大小和想分配的大小相同。
3.SetEndOfFile設置此文件的的結束位置。
Linux實現。
1.open一個文件
方法一
ftruncate此文件
方法二
fallocate此文件
方法三
posix_fallocate此文件
Java方法
今天无意中发现只要文件系统支持Java也能快速预分配。用NIO实现就是:
FileOutputStream fos=new FileOutputStream("haha");
FileChannel fc=fos.getChannel();//个人认为这样创建Channel的设计方式很烂。
fc.position(size_you_want_to_allocate-1);
fc.write(ByteBuffer.allocate(1));
本文介绍在Windows和Linux系统中如何通过预分配文件提高读写性能并减少磁盘碎片。涉及的技术包括使用CreateFile、SetFilePointer等API进行预分配的方法,以及在Linux下利用ftruncate和fallocate等命令实现相同目的。
644

被折叠的 条评论
为什么被折叠?



