在.NET中執行文件IO時,似乎有95%的示例使用4096字節的緩衝區。關於緩衝區長度,4kb有什麼特別之處?或者它僅僅是一個習慣像在for循環中使用我的索引?4kb的緩衝區長度有什麼特別之處?
回答
這是因爲4K是磁盤高達16TB的默認羣集大小。因此,在選擇緩衝區大小時,將緩衝區分配爲簇大小的倍數是有意義的。
羣集是文件分配的最小單位,所以如果一個文件只包含1個字節,它將消耗4K的物理磁盤空間。而一個5K的文件將導致8K分配。
更新:添加了代碼示例用於獲取驅動器的簇大小
using System;
using System.Runtime.InteropServices;
class Program
{
[DllImport("kernel32", SetLastError=true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetDiskFreeSpace(
string rootPathName,
out int sectorsPerCluster,
out int bytesPerSector,
out int numberOfFreeClusters,
out int totalNumberOfClusters);
static void Main(string[] args)
{
int sectorsPerCluster;
int bytesPerSector;
int numberOfFreeClusters;
int totalNumberOfClusters;
if (GetDiskFreeSpace("C:\\",
out sectorsPerCluster,
out bytesPerSector,
out numberOfFreeClusters,
out totalNumberOfClusters))
{
Console.WriteLine("Cluster size = {0} bytes",
sectorsPerCluster * bytesPerSector);
}
else
{
Console.WriteLine("GetDiskFreeSpace Failed: {0:x}",
Marshal.GetLastWin32Error());
}
Console.ReadKey();
}
}
啊,我明白了。認爲這可能是這樣的。有沒有什麼辦法可以在運行時確定磁盤的簇大小以適應磁盤的大小? – sheikhjabootie
我不知道使用託管代碼獲取羣集大小的方法,但可以使用P/Invoke調用Win32 API函數'GetDiskFreeSpace',該函數將返回獲取羣集大小所需的信息。如果需要,我可以在今天晚些時候提供樣品,當時我在我的開發機器上。 –
@CodingHero,我添加了一個快速樣本來確定羣集大小。說實話,我不會走這麼遠來嘗試優化緩衝區大小,我寧願去用4K或8K之類的東西做一些性能測試,看看我需要什麼樣的性能來完成它。只有當我正在處理受限於內存的設備並且我無法承受4K緩衝區時,我纔會減少4K。 –
我的猜測是,這是關係到OS文件塊的大小---的Windows .NET上。
想象一下,兩個南非人從世界的另一端回答同樣的問題。 –
我現在只看到這個評論:) ---是的,我們無處不在! –
幾個因素:
- 更多的,往往不是4K是一個磁盤驅動器上的簇大小
- 4K在Windows上最常用的頁面大小,所以在4K操作系統可以內存映射文件塊
- 4K頁面通常可以從驅動器傳輸到操作系統到用戶進程而不被複制
- Windows使用4K緩衝區將文件緩存到RAM中。
更重要的是在很多人都使用4K作爲因上述的緩衝區長度,因此很多IO和OS代碼爲4K緩衝區優化年!
- 1. 長度和長度()有什麼區別?
- 2. 緩衝區溢出緩衝區長度
- 3. OpenCL中的圖像和緩衝區之間有什麼區別?
- 4. GetPrivateProfileString - 緩衝區長度
- 5. WDF EvtIoDeviceControl緩衝區長度
- 6. HDF5:「文件緩衝區」和「文件緩存」有什麼區別?
- 7. OpenGL中的幀緩衝區對象和像素緩衝區對象之間有什麼區別?
- 8. 什麼是「別名」流緩衝區?
- 9. Openlayer2:什麼是JSTS庫緩衝區長度單位?
- 10. 內容長度和數據長度有什麼區別?
- 11. sendto的最大緩衝區長度?
- 12. 調整AudioUnit緩衝區的長度
- 13. 關閉有什麼特別之處?
- 14. Indexhibit有什麼特別之處?
- 15. const @「SomeString」有什麼特別之處?
- 16. 關於0x55AA有什麼特別之處?
- 17. `str_replace`有什麼特別之處?
- 18. 堆棧溢出和緩衝區溢出有什麼區別?
- 19. RGB緩衝區到JPEG緩衝區,這裏有什麼問題?
- 20. 雙緩衝方法之間的區別
- 21. 如何增加MySQL緩衝區長度?
- 22. 文檔長度不等於緩衝區
- 23. Nightmare.js截圖緩衝區長度0
- 24. 引發緩存和空緩存之間有什麼區別?
- 25. 什麼是緩衝區?
- 26. ENSIME服務器緩衝區的限制長度;掛鉤這個緩衝區
- 27. 什麼是緩衝區?什麼是緩衝讀取和寫入?
- 28. 寫作和寫作之間的衝突有什麼區別?
- 29. 'sprintf'方法是否有默認的緩衝區長度?
- 30. Scala特性與Java 8接口之間有什麼區別和相似之處?
[Optimum file buffer read size?](http://stackoverflow.com/questions/1552107/optimum-file-buffer-read-size) –