我有一些非常大的二进制文件(每个 > 1TB),其中包含高度压缩的数据。我经常从这些文件中读取一些大约 300 字节的数据块。为此,我一次在 7 个线程中打开文件并执行读取操作。
磁盘簇大小如何与此相对应。当我读取 300 字节并且磁盘簇大小设置为 64KB 时,.net 会读取整个 64KB 而不是 300 字节吗?
对于这种情况,小集群还是大集群更好?我使用 FileStream 并将 FileOptions 设置为 FileOptions.RandomAccess。
如果您想在运行时优化从任何给定分区读取的缓冲区大小,您可以更进一步,在运行时获取集群大小,并将其倍数用于读取缓冲区。
但是,您需要从 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
是的,您将从磁盘读取 64kb 块。较小的集群大小将为您提供更快的小范围读取。它有更多文件碎片的风险(可能不是问题)。
但是,通过降低集群大小,您无法获得更多的吞吐量。在磁盘完成查找操作时,确实会获取您的数据,它可能已经读取了大约 1MB 的数据。从 64kb 到 4kb,您节省的费用很少。您节省了大约 1/20 的磁盘寻道时间。
这很简单:
集群规模越小,延迟(延迟)越低,但吞吐量(总体平均数据速率)也越低;