我有一个巨大的行分隔文本文件,我想对每一行进行一些计算。我需要制作一个多线程程序来处理它,因为每条线的处理需要花费最多的时间来完成而不是读取每一行。 (瓶颈在于CPU处理,而不是IO)
我想出了两个选项:
1)从主线程打开文件,在文件句柄上创建一个锁并在工作线程周围传递文件句柄,然后让每个工作者直接读取文件
2)创建一个生产者/消费者设置,其中只有主线程具有对文件的直接读访问权,并使用共享队列将行提供给每个工作线程
要了解的事情:
您会选择哪个选项?为什么?
答案 0 :(得分:5)
我建议使用第二种选择,因为它比第一种选择更清晰,更简单。第一个选项的可伸缩性较低,需要在线程之间进行额外的通信,以便在文件行上同步它们的进度。在第二个选项中,您有一个处理IO的调度程序并启动工作线程以启动它们的计算,并且每个计算线程彼此完全独立,因此允许您进行扩展。此外,在第二个选项中,您可以更清晰地分离逻辑。
答案 1 :(得分:1)
如果我们讨论的是需要使用大型群集处理的大型文件 - MapReduce可能是最佳解决方案。
该框架为您提供了极大的可扩展性,并且已经处理了管理工作人员和容忍失败的所有肮脏工作。
该框架专门用于接收从文件系统[最初为GFS]读取的文件作为输入。
请注意,map-reduce的开源实现:Apache Hadoop
答案 2 :(得分:0)
如果每一行真的是独立的并且处理比读取文件慢得多,那么你可以做的是一次读取所有数据并将其存储在一个数组中,这样每行代表一个数组的元素。
然后所有线程都可以并行处理。例如,如果您有200行和4个线程,则每个线程可以在50行上执行计算。更重要的是,由于这种方法会令人尴尬地并行,因此您可以轻松地使用OpenMP。
答案 3 :(得分:0)
我建议使用第二个选项,因为它在设计方面肯定更好,并且可以让你更好地控制工作线程正在做的工作。
此外,这会提高性能,因为在这种情况下,线程间通信是您描述的两个选项中的最小值
答案 4 :(得分:0)
另一个选择是内存映射文件并维护共享结构,正确处理线程的互斥。