如何高效的預分配磁盤大小給文件

本文介绍在Windows和Linux系统中如何通过预分配文件提高读写性能并减少磁盘碎片。涉及的技术包括使用CreateFile、SetFilePointer等API进行预分配的方法,以及在Linux下利用ftruncate和fallocate等命令实现相同目的。

有時候,預分配一定大小的文件,然后用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));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值