我的程序逐行读取文本文件,提取每行中特定类型的单词(重要的是找到单词的哪一行)。 什么会更好,文件单独的线程(每个线程将读取不同的文件)或按行分开(每个线程将从同一文件读取不同的行)?
答案 0 :(得分:3)
与性能问题一样,您应该尝试两种方法并在可行的情况下进行衡量。但这就是我的直觉所说的:
如果文件大小相似/需要花费相似的时间来处理,那么为每个线程提供自己的文件可能是最好的。
如果计算时间占据文件IO时间,那么访问一个文件的许多线程可能都是值得的。
但是,你应该再衡量一下。猜测性能经常出错。作为@Jerry Coffin points out,很可能两者都无法帮助您,但另一方面,文件可能已经预先加载到RAM中,在这种情况下,他的观点可能适用也可能不适用(完全延伸)。真的,只是试试看。这是一个广泛的领域,很难预测。
答案 1 :(得分:3)
除非您有多个硬盘,否则可能都没有。
硬盘本质上是单线程的 - 也就是说,它在任何给定时间只生成一个数据流。使用带有旋转盘的实际硬盘驱动器和在光盘周围寻找的磁头,您的最佳吞吐量通常来自顺序读取。在文件中查找或在不同文件之间查找到不同的位置会大大降低吞吐量。
如果您有多个驱动器,那么它将取决于您的数据在驱动器中的分布方式,但理想情况下,您可能需要一个专用于从每个物理驱动器读取数据的线程。< / p>
如果您在读取数据后有足够的处理时间,则可以让一个线程读取数据,并将该数据放入某种线程安全的队列中。从那里你有处理线程,它处理各个数据项,处理它们,并将结果写到...你想要输出的地方。
如果它回到一个文件(或多个文件),你可能或多或少地想要反过来:一个线程将输出写入每个结果光盘,并且处理线程以某种形式存储它们的数据队列在典型情况下,这将是按数据顺序写入输出文件的顺序排列的优先级队列,因此输出线程始终按顺序写入数据。
答案 2 :(得分:2)
取决于每个文件有多少文件以及每行有多少行。
如果每个文件中的行数相对较少,那么并行化将不值得开销。如果您处理相对较少的文件也是如此。
可以始终将两者并行化。