【发布时间】:2014-07-09 14:01:15
【问题描述】:
我有一个算法可以执行一些文件 I/O(读、写)和计算。
如果我写入磁带(而不是读取),该算法效果很好。如果我从磁带读取(不写入),性能很差。如果不考虑磁带(仅用于 I/O 的磁盘),那么它的效果很好。
现在,我将其归结为一个我试图理解的相对简单的案例。
设置是磁带上的单个 20 GB 文件。我正在按块顺序读取此文件。
测试算法是这样的:
while (fileRemaining)
{
ReadBlock(blockSize);
Sleep(sleepTime); // this is to mimic computation time
}
一些观察:
- 当使用 8K 的 blockSize 和 0 的 sleepTime 时,吞吐量(数据读取/秒)很好。此外,磁带机不断发出噪音。
- 当使用 8K 的块大小和任何非零睡眠时间(甚至 1 毫秒)时,吞吐量会受到严重影响。数据仍会被读取,但磁带机不会经常发出噪音。它会安静一会儿,偶尔会发出噪音。
- 当使用2M的blockSize和100ms的sleepTime时,吞吐量很好。磁带机在整个过程中都会发出噪音(尽管听上去像是速度较慢?)。
- Windows 资源管理器能够以良好的吞吐量将文件从磁带传输到磁盘。
如何在此处获得良好的读取性能?
如果您也愿意帮助我理解其他谜团 - 为什么 Sleep 的存在会如此显着地降低吞吐量(知道这一点有助于重新思考算法)?一次从磁带读取的“最佳”数量是多少?来自磁带驱动器的噪音是否与注意事项相关?
【问题讨论】:
-
读取块是为了尽量减少存储在 RAM 中的数据量。您不必使用这么小的块大小。
-
您的磁带机的读取速度是多少?如果它是 80MB/s,那么读取 8KB 需要 0.1ms(假设没有查找开销)。很明显,相应的 1 毫秒睡眠会大大减慢速度。
-
@OliCharlesworth 抱歉,我之前遗漏了数字。我相信它大约是 80 MB/s(这只是我观察到的最好的)。你的分析是正确的,我们应该预计会出现大幅放缓,大约是一个幅度。因为现在读取 8KB 需要 1.1 毫秒,也就是大约 7.1 MB/秒。然而,实际上阅读速度低于 150 KB / s
-
@LemonBeagle:我对磁带操作的特性了解不多,但我预计每次读取操作(加速和减速磁带或其他)也会涉及很大的开销。
标签: performance io