不确定这是这个问题的最佳标题,但现在就这样了。
通过python / Qt我启动了一个可执行文件的多个进程。每个进程都是以块的形式将大文件(~20GB)写入磁盘。我发现第一个开始的过程总是最后一个完成并持续很长时间,比其他进程要长得多(尽管要写入相同数量的数据)。
性能监视器显示该进程仍在使用预期的RAM量(~1GB),但进程中的磁盘活动已减慢到涓流。
为什么会这样?就好像第一个过程开始以某种方式得到它的'#磁盘访问'被阻止'通过其他流程,然后在其他流程完成后无法恢复...
操作系统(Windows)会导致此问题吗?我该怎么做才能缓解这种情况?
答案 0 :(得分:2)
如果您真的有足够的资源来更快地解决问题,并行(任何类型)只会导致加速。
Before thinking of optimizing your program,你应该仔细分析导致它运行(主观上)慢的原因 - bottleneck。
虽然我对您的程序存在什么样的瓶颈一无所知,但它将大量数据写入磁盘这一事实很好地暗示它可能是I/O bound。
当一个程序被I / O绑定时,传统的单机并行化技术(线程,多个进程)比无用的更糟糕 - 它们实际上会损害性能,特别是如果你正在处理用旋转磁盘。发生这种情况是因为一旦您有多个进程在不同位置访问磁盘,硬盘驱动器头之间必须seek。
一旦您有多个进程访问I / O,以及进程如何分配磁盘访问权限,操作系统的I/O scheduler会对性能变慢产生很大影响。您可以考虑切换您的操作系统,但只有在首先需要需要这些多个流程时才会这样做。
话虽如此,可以做些什么才能获得更好的(I / O)性能?
答案 1 :(得分:0)
无法保证I / O调度的公平性。您所描述的内容似乎相当简单:I / O调度程序,无论是否有意,都会促进新进程。由于您的磁盘已被轻敲,因此处理完成的顺序不在您的控制之下。由于来自多个进程的并行访问,您最有可能在搜索上浪费大量磁盘带宽。
TL; DR:你的期望是没有根据的。当I / O,特别是虚拟内存系统饱和时,任何事情都可能发生。它确实如此。