我有一些非常大的二进制文件(每个> 1TB)具有高度压缩的数据。我经常从这些文件中读取一些大约300字节的数据块。为此,我将文件一次打开7个线程并执行读取操作。
磁盘群集大小如何与此对应。当我读取300个字节并且磁盘簇大小设置为64KB时,.net会读取整个64KB而不是300个字节吗?
对于这种情况,小型或大型群集的大小是否更好? 我使用FileStream,FileOptions设置为FileOptions.RandomAccess。
答案 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)
很简单:
群集大小越小,延迟(延迟)越低,但吞吐量(整体平均数据速率)也越低;