在这种情况下如何有效地使用线程?

时间:2016-09-08 04:25:55

标签: java multithreading performance thread-safety combinations

我必须在文件中写入使用线程的彩票产生的所有可能组合。示例:

  1. 0 0 0 0 0 0(第一次组合)
  2. 0 0 0 0 0 1(第二次组合)
  3. 0 0 0 0 0 2
    。 。 。
    持续。 38 38 38 38 38 38(最后组合)
  4. 在我的主类中,我只使用一个线程,因为我不知道如何更快地使用更多线程来写入文件。

    为了生成数字,我用另一个在另一个内部使用6个循环:

    {{1}}

    此外,文件(执行中间)的大小增加了8gb,我必须停止它,因为我的电脑崩溃了。

    编辑:     如果我不能这样做,至少我几乎可以同时在同一个文件中用两个不同的线程写?如果我能做到这一点我会怎么做?

1 个答案:

答案 0 :(得分:5)

你先停下来。说真的:退一步。

首先,由于tkausl正确评论,当您的瓶颈是IO性能时,使用多个线程可能无济于事。相反 - 将多个线程写入相同的文件可能并非全部有用。除此之外,要做到这一点很难

因此,如果有的话,您必须考虑将此任务分发到几个系统。然后我们查看您的代码;很明显,你不能用这样的代码做到这一点。

这是我的初步观点:您的代码非常低级别。几乎没有抽象可以将这项任务中的不同活动彼此分开。只需在循环内循环循环。这可能是"做的代码"它的工作(或者如果"预期"输出会更小);但它并不包含你需要的任何有用的抽象,以及#34;适应"它符合您的实际需求。

长话短说:如果你真的想尝试多线程的东西;然后将代码转换为基于 stream 的解决方案。然后,当有效时,您可以学习 parallel 流;并使用它们来运行你的代码"并行"。

仅供记录:您的代码中存在错误

linea.append(i + " " +j + " " +j2 + " " +k + " " +k2 + " " +l + "\n");
bw.write(linea.toString())

将新行追加到您的缓冲区;然后写入整个缓冲区。但是:在您的缓冲区中保留

所以,也许在这种情况下," easy"回答是:清除缓冲区写完内容后!喜欢:linea.delete(0, linea.length())。顺便说一句:使用StringBuilder;不是StringBuffer。您只需为每一行创建一个新构建器(而不是一直使用/清除同一构建器)。

你最有可能得到你的异常,因为你的StringBuffer不断增长和增长;直到你的内存耗尽。

最后说明:退步仍然是这里要做的事情。如果我没有弄错,你打算创建的文件将有38 * 38 * 38 * 38 * 38 * 38行, 这构成了3.010.936.384,因此大约有30亿条目。假设每行包含10,15个字节。所以你最终得到一个大约30 GB左右的文件。但为什么?该文件将包含这些值的简单排列。 通过一些数学运算......单独的行号可用于计算在该行中找到的字符串!因为您可以将1到3.010.936.384之间的任何值映射到相应的"置换"。

所以,更长的故事简短:无论什么程序使用30 GB文件 - 它都不需要。你知道存在多少种排列;并且您可以轻松地计算(也就是预测)排列。 需要这些排列的任何程序都可以做到!如果您可以轻松地计算数据,那么将30 GB的数据写入文件系统是没有意义的!

因此,实质上:忘记将这些东西写入文件。你没有。这只会花费你以后的写作和阅读时间。你知道," IO"仍然是最昂贵的事情。

相关问题