假设我想在我的2核机器上执行以下操作:
阅读一个非常大的文件
计算
文件读取操作是否需要消耗1个核心?以前我只创建了2个线程,一个用于读取文件,另一个用于计算?我应该创建一个额外的线程来进行计算吗?
感谢。
修改
谢谢大家,是的,我们应该始终考虑文件I / O是否阻止计算。现在让我们只考虑文件I / O永远不会阻止计算,你可以认为计算不依赖于文件的数据,我们只是读取文件以供将来处理。现在我们有2个核心,我们需要读取一个文件,我们需要进行计算,它是创建3个线程的最佳解决方案,1个用于文件读取,2个用于计算,正如大多数人已经指出的那样:文件阅读消耗的CPU很少?
答案 0 :(得分:4)
这取决于您的硬件配置方式。通常,由于DMA,读取不是CPU密集型的。但是,如果它启动其他应用程序的交换,它可能会非常昂贵。但还有更多。
如果您的文件非常大,则在不需要一次读取整个文件时,应使用mmap或顺序处理。尝试通过块来消费它。
例如,要对大文件中的所有值求和,您不需要将此文件加载到内存中。您可以通过小块处理它,累积总和。在大多数情况下,内存是一种昂贵的资源。
文件读取操作是否需要消耗1个核心?
是的,我认为大多数低级读取操作是按顺序实现的(消耗1个核心)。
如果使用asynchronous I/O,则可以避免阻止读取操作,但它只是“小块读取”技术的变体。您可以一次启动多个小型异步读取操作,但在使用结果之前,您始终要检查操作是否已完成。
另请参阅此Stack Overflow answer相关问题。)
以前我只创建了2个线程,一个用于读取文件,另一个用于计算?我应该创建一个额外的线程来进行计算吗?
如果您需要所有数据来开始计算,则取决于没有理由并行启动计算。它必须有效地等待,直到完成阅读。
如果您甚至可以使用部分数据开始计算,则可能不需要一次读取整个文件。通常情况下,最好不要使用大文件。
最后,您应该知道您的任务是计算绑定还是输入输出绑定。如果受输入输出子系统性能的限制,并行计算几乎没有什么好处。如果计算非常耗费CPU,并且读取时间可以忽略不计,那么您可以从并行计算中受益。输入输出通常是一个瓶颈,除非你做一些数字运算。
答案 1 :(得分:2)
这是并行化的理想选择,因为这里有两种类型的操作 - 磁盘I / O(用于读取文件)和CPU负载(用于计算)。因此,第一步是编写应用程序,使文件I / O不会阻止计算。您可以通过从文件中一次读取一点并将其交给计算线程来完成此操作。
但是现在你说你有两个你想要使用的核心。关于并行化CPU密集型部分的第二个想法是正确的,因为如果我们有多个处理器可供使用,我们只能并行化计算任务。但是,可能的情况是,应用程序的阻塞部分仍然是文件I / O--这取决于很多因素,并且判断什么级别的并行化是合适的唯一方法是进行基准测试。
SO需要警告:多线程很难并且容易出错,如果只能选择一个,那么拥有正确的代码比快速代码更好。但我并不主张反对线程,正如您可能从网站上的其他人那里找到的那样。
答案 2 :(得分:0)
我认为这取决于您正在执行的计算。如果你正在进行非常繁重的计算,那么我建议线程化应用程序。读取文件对CPU的要求很少,因此,线程化应用程序所产生的开销可能会降低速度。
另一件需要考虑的事情是,如果你需要在计算之前加载整个文件,如果是这样的话,根本不需要线程化它,因为你必须完成一个动作才能执行另一个动作。