我有 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/