java - 在 Java 中处理大量数据的有效方法

标签 java algorithm

我有 10 亿条未排序、彼此无关的记录,我必须使用 Java 对每条记录调用函数 processRecord

这样做的简单方法是使用 for 循环,但这会花费很多时间。

我能想到的另一种方法是使用多线程,但问题是如何有效地划分记录数据集以及在多少线程之间划分

是否有一种有效的方法来处理这个大型数据集?

最佳答案

衡量 在确定选择哪种实现路径之前,您应该衡量处理单个项目需要多长时间。基于此,您可以选择提交给线程池、队列、集群的工作 block 的大小。非常小的工作 block 会增加协调开销。太大的工作 block 将需要很长时间才能处理,因此您将获得较少的渐进进度信息。

单机处理更容易实现,故障排除维护和推理。

单机处理

使用 java.util.concurrent.ExecutorService 使用 submit(Callable<T> task) 提交每件作品方法 https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html#submit-java.util.concurrent.Callable-

使用 java.util.concurrent.Executors.newFixedThreadPool(int nThreads) 创建 ExecutorService 实例.为 nThreads 选择合理的值 Nnumber of CPU cores 是合理的启动值。如果处理中有一些阻塞 IO 调用(数据库、HTTP),您可以添加使用更多线程。

在多台机器上处理 - 集群 将处理作业提交给集群处理技术,例如 Spark、Hadoop、Google BigQuery。

在多台机器上处理 - 队列 您可以将您的记录提交到任何队列系统(Kafka、RabbitMQ、ActiveMQ 等)。然后让多台机器消耗队列中的项目。您将能够随时添加/删除消费者。如果您不需要将处理结果放在一个地方,这种方法很好。

关于java - 在 Java 中处理大量数据的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49720803/

相关文章:

arrays - Kadane 的算法是否适用于运行长度编码的整数数组?

mysql - 如何在不检查数据库中是否存在的情况下生成 8 个字符的唯一字符串

java - 将字符串排列为大写和小写

java - 是否有Java,Javascript,Python中用于日历计算的良好框架,可以从公历转换为希伯来语日历?

java - apache commons beanutils,如何设置属性值?

c++ - 使用斐波那契递归打印 1 到 n

java - 有没有办法取消 javafx 中的焦点?

java - 操作栏菜单项未正确着色

algorithm - 有约束的一维旅行推销员

javascript - 将图节点的相对位置投影到绝对坐标