磁盘簇/块大小与二进制文件读取有何关系
本文关键字:何关系 关系 读取 二进制文件 磁盘 | 更新日期: 2023-09-27 18:36:06
我有一些非常大的二进制文件(每个>1TB),其中包含高度压缩的数据。我经常从这些文件读取一些大约 300 字节的数据块。为此,我一次在 7 个线程中打开文件并进行读取操作。
磁盘簇大小如何与此相对应。当我读取 300 字节并且磁盘簇大小设置为 64KB 时,.net 会读取整个 64KB 而不是 300 字节吗?
对于此方案,小型或大型群集大小是否更好?我使用FileStream,FileOptions设置为FileOptions.RandomAccess。
优化缓冲区大小,以便在运行时从任何给定分区读取,则可以更进一步,在运行时获取簇大小,并将其倍数用于读取缓冲区。
但是,您需要从内核 32 .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);
将路径传递给您感兴趣的驱动器的根目录。要获取每个集群的字节数,请将 lpSectorPerCluster 乘以 lpBytesPerSector。
有关详细信息,以下是有关此函数的 pinvoke.com 页面:http://www.pinvoke.net/default.aspx/kernel32.GetDiskFreeSpace
是的,您将从磁盘上读取 64kb 块。较小的簇大小将为您提供对小范围的更快读取。它存在更多文件碎片的风险(可能不是问题)。
但是,通过降低群集大小,无法获得更多吞吐量。在磁盘完成查找操作时,确实获取了您的数据,它可以读取大约 1MB 的数据。从 64kb 到 4kb 节省的成本很少。您节省了大约 1/20 的磁盘寻道时间。
很简单:
簇大小越小,延迟(延迟)越低,但吞吐量(总体平均数据速率)也越低;