我有一个算法可以执行一些文件 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 资源管理器能够以良好的吞吐量将文件从磁带传输到磁盘。
如何在这里获得良好的读取性能?
如果您也愿意帮助我理解其他奥秘——为什么睡眠的存在会如此显着地降低吞吐量(知道这有助于重新思考算法)?一次从磁带读取的“最佳”数量是多少?来自磁带驱动器的噪音是否与注意相关?