【问题标题】:How is disk cluster/block size relevant for binary file reading?磁盘簇/块大小与二进制文件读取有何关系?
【发布时间】:2012-06-08 02:14:30
【问题描述】:

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

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

在这种情况下,小集群还是大集群更好? 我使用 FileStream 并将 FileOptions 设置为 FileOptions.RandomAccess。

【问题讨论】:

    标签: c# .net file


    【解决方案1】:

    如果您想在运行时优化从任何给定分区读取的缓冲区大小,您可以更进一步,在运行时获取集群大小并将其倍数用于读取缓冲区。

    但是,您需要从 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

    【讨论】:

      【解决方案2】:

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

      但是,通过降低集群大小,您无法获得更多的吞吐量。在磁盘完成查找操作时,确实会获取您的数据,它可能已经读取了大约 1MB 的数据。从 64kb 到 4kb,您节省的费用很少。您节省了大约 1/20 的磁盘寻道时间。

      【讨论】:

        【解决方案3】:

        很简单:

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

        【讨论】:

        • 较小的集群规模根本不会降低吞吐量。
        • @usr:是的,因为有更多的开销。 (虽然它只影响随机读取而不是顺序读取。)
        • 反之亦然:如果有一个效果,它会更多地影响顺序操作。小集群的唯一两个影响是更多的分配开销和更多的碎片。碎片化会影响顺序访问,而不是随机访问。
        • @usr:你说得对,我说的是错的——因为我不是我的意思。当我说“随机读取”时,我指的是从 磁盘 的角度来看的“随机”,而不是从 文件系统 的角度。即,如果您的集群大小较小,那么当您的数据碎片化时,磁盘的随机读取将使您每次查找的数据更少,因此会伤害您。但我的措辞很糟糕,我同意。 :\
        猜你喜欢
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-13
        • 2021-04-29
        • 2021-01-21
        • 1970-01-01
        相关资源
        最近更新 更多