磁盘簇/块大小与二进制文件读取有何关系

本文关键字:何关系 关系 读取 二进制文件 磁盘 | 更新日期: 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 的磁盘寻道时间。

很简单:

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