Bai*_*ang 3 parallel-processing file-io
假设我想在我的 2 核机器上执行以下操作:
读取一个非常大的文件
计算
文件读取操作需要消耗1核吗?以前我只创建了 2 个线程,一个用于读取文件,一个用于计算?我应该创建一个额外的线程来进行计算吗?
谢谢。
编辑
谢谢大家,是的,我们应该始终考虑文件 I/O 是否会阻塞计算。现在我们只考虑文件I/O永远不会阻塞计算,你可以认为计算不依赖于文件的数据,我们只是读入文件以备将来处理。现在我们有2个核心,我们需要读入一个文件,我们需要做计算,创建3个线程,1个用于文件读取,2个用于计算,是不是最好的解决方案,正如你们大多数人已经指出的:文件阅读消耗很少的CPU?
这取决于您的硬件是如何配置的。通常,由于DMA,读取不是 CPU 密集型的。但是,如果它启动其他应用程序的换出,它可能会非常昂贵。但还有更多。
如果你的文件真的很大,当你不需要一次读取整个文件时,你应该使用mmap或顺序处理。尝试分块消费它是可能的。
例如,要对一个大文件中的所有值求和,您不需要将此文件加载到内存中。您可以分小块处理,累加总和。在大多数情况下,内存是一种昂贵的资源。
文件读取操作需要消耗1核吗?
是的,我认为大多数低级读取操作都是按顺序实现的(消耗 1 个内核)。
如果您使用异步 I/O,则可以避免读取操作阻塞,但这只是相同“小块读取”技术的变体。您可以一次启动几个小的异步读取操作,但在使用结果之前,您必须始终检查操作是否已完成。
另请参阅相关问题的堆栈溢出答案)。
以前我只创建了 2 个线程,一个用于读取文件,一个用于计算?我应该创建一个额外的线程来进行计算吗?
这取决于,如果您需要所有数据来开始计算,那么就没有理由并行开始计算。它必须有效地等待,直到读取完成。
如果即使使用部分数据也可以开始计算,则可能不需要一次读取整个文件。通常最好不要对大文件这样做。
最后,您应该知道您的任务是受计算限制还是受输入输出限制。如果受限于输入输出子系统的性能,并行化计算几乎没有什么好处。如果计算占用大量 CPU,并且读取时间可以忽略不计,您可以从并行计算中受益。除非您进行一些数字运算,否则输入-输出通常是一个瓶颈。