我有一个java应用程序,我将其移植为云架构的概念验证。我想通过在不同VM上的文件块上运行相同的处理程序来处理非常大的文本文件。
工作线节点= n
运行Master和一个Worker的头节点,带有n-1个Worker节点
我有两个想法:
Master逐行读取文件,将第一行发送到第一个工作节点,第二个发送到第二个工作节点,依此类推,重复每n行。
Master读取文件中的行数。然后,工作线程节点被指示从文件中同时读取no_of_lines
/ n。
我正在考虑使用基于RMI或套接字的方法来传输数据。谁能告诉我上述哪种方法效率最高?如果在没有指定我将使用哪种java构造的情况下无法回答这个问题,我将非常感谢您提出的建议。
另外,如果每个节点都知道它应该读取哪些行,那么锁定会成为并发文件访问的问题吗?
感谢您的任何建议
伊恩
答案 0 :(得分:2)
首先考虑第二个问题,许多程序读取一个文件时没有任何问题IFF没有程序正在编写文件:每个程序都有自己的文件位置指针。即使某个程序正在写入该文件,如果该程序始终在文件的末尾写入,也可能没有任何问题,在任何理智的系统中,总是如此。
至于第一个问题,IFF文件中的所有行都是恒定长度的,那么问题始终是效率问题:读取多行比读取一行更有效。
如果我在做项目,主人会要求工人阅读(n_lines_in_file / n_workers)行。在主人的阅读线上似乎没有什么意义,并将它们传递给工人。但是,假设每条线的工作处理量与其他线相同。
如果这不是真的,或者还有其他变量你没有告诉过,我的策略无疑会改变。
答案 1 :(得分:1)
当你分解一个程序时,你应该确保你没有创造比你想要保存更多的开销。例如,与进行RMI调用相比,阅读几行文本相对便宜。将数据复制到许多主机可能比您打算进行的处理更昂贵。
处理需要多长时间?这将指导您每项工作需要多大才能提高效率。您可能会发现最佳线程数是一个。 ;)