gpt4 book ai didi

java - Hadoop Java 与 C/C++ 在 CPU 密集型任务上的对比

转载 作者:可可西里 更新时间:2023-11-01 14:18:57 26 4
gpt4 key购买 nike

我是 Hadoop 新手。我想使用 Hierarchical Clustering 对大约 1.5 亿个项目进行聚类,每个项目都具有大约 30 个属性。维度/属性的总数约为 5000。

我设计了一个多级解决方案,对整个数据进行分区并对每个分区执行聚类,然后合并每个聚类,直到检索到所需数量的聚类。

- Clustering is performed in each map task. So, each map task would be cpu-intensive.
- I am stuck at deciding about which of the following options to use:
- Map-Reduce in native Java.
- Map-Reduce using Hadoop Streaming on C.(This is because of each task being cpu-intensive).

Which option should I go with?. Is there any other way I could achieve my destination?

最佳答案

在许多情况下,除非仔细优化 C 代码,否则 Java(如果编写得当)将产生与 C 类似的性能。在令人惊讶的许多情况下,编写良好的 Java 代码确实优于 C 代码,因为 C 代码在编译时进行了优化,而 Java 热点编译器在运行时(它在运行时进行优化)有关于每个代码路径的使用频率的统计数据)。如果您收集了类似的统计数据,并且它们不会根据您的数据而改变,您有时可以向 C 编译器提供提示,例如通过使用 __builtin_expect()在某些 C 编译器中可用。但这真的很难做到。

但是请记住,Java 的某些部分的价格相当高:

  • 从不使用Collection<Integer> , ArrayList<Double>等用于计算,因为装箱成本。这些在热循环中真的非常昂贵。
  • 考虑使用比 BufferedReader 更快的 I/O . Hadoop 使用 Text 是有原因的而不是 String - 缓冲区回收降低了 I/O 成本。
  • 启动成本。您的应用应该长时间运行,而不是经常重启。

对于 hadoop,请记住 Hadoop 流式传输不是免费的。如果您还没有意识到:hadoop-streaming 本身是用 Java 实现的。所有数据都将通过 Java。 Hadoop 流是一个 Java 应用程序,它启动您的脚本应用程序,向其写入数据(即序列化数据!),并读回输出(反序列化数据!)。除了您的实际程序成本之外,您几乎还获得了所有 Java 成本:hadoop streaming 是一个用 Java 编写的映射器,它将数据传递给外部程序,读回答案,并将其返回给 Hadoop。对一些简单的东西进行基准测试,例如用 C 编写的字数统计与用 Java 编写的优化字数统计,以查看差异。

对于您执行 HAC 的实际任务:首先确保您具有工作相似性。没有什么比构建一个大规模聚类算法只是为了发现它不起作用更糟糕的了,因为你无法以有意义的方式衡量相似性。 首先在小样本上解决问题,然后扩大规模。

关于java - Hadoop Java 与 C/C++ 在 CPU 密集型任务上的对比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25479646/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com