如何使Java代码可并行化?我如何使其可云化?

如何使Java代码可并行化?我如何使其可云化?,java,concurrency,cloud,Java,Concurrency,Cloud,我现在正在研究一个系统。这是一个复杂的系统,但它归结为一个解算器类,其方法如下: public int solve(int problem); // returns the solution, or 0 if no solution found 现在,当系统启动并运行时,预计该方法的运行时间约为5秒,并且速度非常快。但是,我计划运行一些看起来有点像这样的测试: List<Integer> problems = getProblems(); List<Integer> s

我现在正在研究一个系统。这是一个复杂的系统,但它归结为一个
解算器
类,其方法如下:

public int solve(int problem); // returns the solution, or 0 if no solution found
现在,当系统启动并运行时,预计该方法的运行时间约为5秒,并且速度非常快。但是,我计划运行一些看起来有点像这样的测试:

List<Integer> problems = getProblems();
List<Integer> solutions = new ArrayList<Integer>(problems.size);
Solver solver = getSolver();
for (int problem: problems) {
    solutions.add(solver.solve(problem));
}
// see what percentage of solutions are zero
// get arithmetic mean of non-zero solutions
// etc etc
List problems=getProblems();
列表解决方案=新的ArrayList(problems.size);
Solver=getSolver();
for(整数问题:问题){
解决方案。添加(解算器。解决(问题));
}
//看看有多少百分比的解决方案是零
//得到非零解的算术平均值
//等等
问题是我想在大量问题上运行它,不想永远等待结果。假设我有一百万个测试问题,我想在我泡一杯茶的时间内完成测试,我有两个问题:

  • 假设我有一个百万核处理器,
    Solver
    的实例是线程安全的,但没有锁定(它们是不可变的或其他),它们所做的所有计算都在内存中(即没有磁盘、网络或其他东西在进行)。我可以用线程安全列表替换解决方案列表,启动线程来解决每个问题,并期望它更快吗?要快多少?它能在5秒内运行吗

  • 有没有一个像样的Java云计算服务,我可以在那里购买500万秒的时间,并让代码在5秒内运行?我需要做什么来准备我的代码以便在这样的云上运行?500万秒到底要花多少钱


  • 谢谢。

    你问的问题太大了。线程有开销,需要注意的一点是,它们在父进程中运行。如果你想同时运行一百万个这样的解算器,你必须将它们投入到自己的流程中。

    你提出了非常大的问题。线程有开销,需要注意的一点是,它们在父进程中运行。如果你想同时运行一百万个这样的解算器,你就必须把它们分给它们自己的进程。

    你可以对每个输入使用一个程序,然后使用一个简单的批处理调度器,比如Condor(Linux版)或HPC(Windows版)。您也可以在Amazon上运行这些程序,但有一个学习曲线,它不仅仅是“上传Java代码和go”。

    您可以在每个输入中使用一个程序,然后使用一个简单的批处理调度器,如Condor(Linux版)或HPC(Windows版)。你也可以在Amazon上运行它们,但是有一个学习曲线,它不仅仅是“上传Java代码和go”

  • 当然,您可以使用标准工作线程范例来并行运行。但是会有一些同步开销(例如,当所有操作都试图同时完成时,对解决方案列表的更新将导致锁争用),因此它不会在5秒内运行。但它的速度将超过500万秒:-)
  • AmazonEC2每小时运行在0.085美元到0.68美元之间,这取决于您需要多少CPU(请参阅)。那么,大概120美元左右。当然,您需要设置一些单独的东西,以便在不同的CPU之间分配作业。一种选择可能是只使用Hadoop(请参见关于是否使用Hadoop的问题)
  • 你可以阅读类似的文章,了解更多关于如何并行思考的信息

  • 当然,您可以使用标准的工作线程范例并行运行。但是会有一些同步开销(例如,当所有内容都试图同时完成时,对解决方案列表的更新将导致锁争用),因此它不会在5秒内运行。但会快于500万秒:-)
  • AmazonEC2每小时运行在0.085美元到0.68美元之间,这取决于您需要多少CPU(请参阅)。那么,大概120美元左右。当然,您需要设置一些单独的东西,以便在不同的CPU之间分配作业。一种选择可能是只使用Hadoop(请参见关于是否使用Hadoop的问题)

  • 您可以阅读类似的内容,以获取有关如何并行思考的更多信息。

    查看这些关于并发性的文章:

    基本上,Java 7新的Fork/Join模型对这种方法非常有效。基本上,您可以设置数百万个以上的任务,并将它们尽可能分散到所有可用的处理器上。您必须提供自定义的“云”任务执行器,但这是可以做到的


    当然,这假设您的“求解”算法是完全并行的。简言之,只要解算器是完全自包含的,它们就应该能够在任意数量的处理器之间进行拆分。

    查看这些关于并发性的文章:

    基本上,Java 7新的Fork/Join模型对这种方法非常有效。基本上,您可以设置数百万个以上的任务,并将它们尽可能分散到所有可用的处理器上。您必须提供自定义的“云”任务执行器,但这是可以做到的


    当然,这假设您的“求解”算法是完全并行的。简言之,只要解算器是完全自包含的,它们就应该能够在任意数量的处理器之间拆分。

    使用适当的执行器。查看()

    使用适当的执行器。查看()

    您已经用两个主要的序列化点表达了您的问题:问题产生和解决方案消耗(目前表示为整数列表)。您希望尽快得到第一个问题(目前,在所有问题产生之前,您不会得到它们)

    我还假设问题列表顺序和解决方案列表顺序之间存在相关性,即
    解决方案。get(3)
    问题的解决方案。get(3)
    –这将是一个巨大的并行问题。您最好使用
    对<