磁盘集群/块大小如何与二进制文件读取相关?

时间:2012-06-03 21:09:57

标签: c# .net file

我有一些非常大的二进制文件(每个> 1TB)具有高度压缩的数据。我经常从这些文件中读取一些大约300字节的数据块。为此,我将文件一次打开7个线程并执行读取操作。

磁盘群集大小如何与此对应。当我读取300个字节并且磁盘簇大小设置为64KB时,.net会读取整个64KB而不是300个字节吗?

对于这种情况,小型或大型群集的大小是否更好? 我使用FileStream,FileOptions设置为FileOptions.RandomAccess。

3 个答案:

答案 0 :(得分:5)

如果要在运行时优化从任何给定分区读取的缓冲区大小,可以更进一步,在运行时获取簇大小,并为读缓冲区使用其倍数。

但是,您需要使用kernel32.dll中的PInvoke来执行此操作。

使用GetDiskFreeSpace函数获取给定分区的簇大小。

以下是方法签名:

[DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Auto)]
   static extern bool GetDiskFreeSpace(string lpRootPathName, 
   out uint lpSectorsPerCluster, 
   out uint lpBytesPerSector, 
   out uint lpNumberOfFreeClusters, 
   out uint lpTotalNumberOfClusters);

将路径传递给您感兴趣的驱动器的根目录。 要获得每个簇的字节数,请将lpSectorsPerCluster乘以lpBytesPerSector。

有关详细信息,请参阅此函数的pinvoke.com页面: http://www.pinvoke.net/default.aspx/kernel32.GetDiskFreeSpace

答案 1 :(得分:1)

是的,您将从磁盘上读取64kb块。较小的簇大小将为您提供更快的小范围读取。它存在更多文件碎片的风险(可能不是问题)。

但是,通过降低群集大小,您无法获得更多吞吐量。在磁盘完成搜索操作的时候,确实可以读取大约1MB数据的数据。从64kb到4kb,你节省的很少。你节省了大约1/20的磁盘搜索时间。

答案 2 :(得分:0)

很简单:

群集大小越小,延迟(延迟)越低,但吞吐量(整体平均数据速率)也越低;