3

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

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

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

4

3 回答 3

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

于 2012-06-04T01:09:41.330 回答
1

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

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

于 2012-06-03T21:37:35.747 回答
0

这很简单:

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

于 2012-06-03T21:39:42.640 回答