并发文本文件由许多VM读取

时间:2011-04-22 15:54:39

标签: java concurrency cloud distributed

我有一个java应用程序,我将其移植为云架构的概念验证。我想通过在不同VM上的文件块上运行相同的处理程序来处理非常大的文本文件。

工作线节点= n

运行Master和一个Worker的头节点,带有n-1个Worker节点

我有两个想法:

  1. Master逐行读取文件,将第一行发送到第一个工作节点,第二个发送到第二个工作节点,依此类推,重复每n行。

  2. Master读取文件中的行数。然后,工作线程节点被指示从文件中同时读取no_of_lines / n。

  3. 我正在考虑使用基于RMI或套接字的方法来传输数据。谁能告诉我上述哪种方法效率最高?如果在没有指定我将使用哪种java构造的情况下无法回答这个问题,我将非常感谢您提出的建议。

    另外,如果每个节点都知道它应该读取哪些行,那么锁定会成为并发文件访问的问题吗?

    感谢您的任何建议

    伊恩

2 个答案:

答案 0 :(得分:2)

首先考虑第二个问题,许多程序读取一个文件时没有任何问题IFF没有程序正在编写文件:每个程序都有自己的文件位置指针。即使某个程序正在写入该文件,如果该程序始终在文件的末尾写入,也可能没有任何问题,在任何理智的系统中,总是如此。

至于第一个问题,IFF文件中的所有行都是恒定长度的,那么问题始终是效率问题:读取多行比读取一行更有效。

如果我在做项目,主人会要求工人阅读(n_lines_in_file / n_workers)行。在主人的阅读线上似乎没有什么意义,并将它们传递给工人。但是,假设每条线的工作处理量与其他线相同。

如果这不是真的,或者还有其他变量你没有告诉过,我的策略无疑会改变。

答案 1 :(得分:1)

当你分解一个程序时,你应该确保你没有创造比你想要保存更多的开销。例如,与进行RMI调用相比,阅读几行文本相对便宜。将数据复制到许多主机可能比您打算进行的处理更昂贵。

处理需要多长时间?这将指导您每项工作需要多大才能提高效率。您可能会发现最佳线程数是一个。 ;)