我知道他们说过早的优化是万恶之源……但就是那个时候。
我有一个缓慢但可以执行以下操作的工作程序:
- 从 file.input 读取块(顺序)
- 变换块
- 将转换后的块写入(附加)到 file.output
file.input 和 file.output 最终处于相同大小的范围内(10-100+ GB)。一个块通常约为 10K。转换步骤只是专有格式之间的转换。为了便于讨论,我们可以认为它在计算上与实时压缩算法相当。
这些步骤目前在单个线程中完成。
我的问题:如何让这个表现更好?
我意识到基于正在处理的纯数据量,这永远不会变得“快”,但我必须相信有一些相对简单和标准的技术可以让这个更快。
我尝试在读取步骤 (1) 中添加缓冲。也就是说,读取比块大小大得多的块并从缓冲区中读取。这有帮助。但是,对于转换步骤 (2) 和附加 (3) 是否可以做任何事情,我有点坚持。
根据 Resource Monitor,我的 CPU 使用率在 30-45% 之间波动,磁盘 I/O 有一些持续的低使用率。
我将 C# 与一堆 P/invoke 互操作与本机库一起使用。