java中处理大型数据集的有效方法
我有10亿条记录未排序,彼此不相关,我必须使用Java对每条记录调用函数processRecord 实现这一点的简单方法是使用for循环,但这需要很多时间 我可以想到的另一种方法是使用多线程,但问题是如何有效地划分记录数据集,以及在多少线程之间划分 有没有一种有效的方法来处理这个大数据集?度量 在决定选择哪种实现路径之前,您应该测量处理单个项目所需的时间。基于此,您可以选择提交到线程池、队列和集群的工作块的大小。非常小的工作块会增加协调开销。太大的工作块将需要很长的时间来处理,所以您将有较少的渐进式进展信息 单机处理更易于实施、故障排除、维护和推理 单机处理 使用java.util.concurrent.ExecutorService 使用java中处理大型数据集的有效方法,java,algorithm,Java,Algorithm,我有10亿条记录未排序,彼此不相关,我必须使用Java对每条记录调用函数processRecord 实现这一点的简单方法是使用for循环,但这需要很多时间 我可以想到的另一种方法是使用多线程,但问题是如何有效地划分记录数据集,以及在多少线程之间划分 有没有一种有效的方法来处理这个大数据集?度量 在决定选择哪种实现路径之前,您应该测量处理单个项目所需的时间。基于此,您可以选择提交到线程池、队列和集群的工作块的大小。非常小的工作块会增加协调开销。太大的工作块将需要很长的时间来处理,所以您将有较少的渐
Submit(可调用任务)
方法提交每个工件
使用java.util.concurrent.Executors.newFixedThreadPool(int-nThreads)
创建ExecutorService实例。为nThreads选择合理的值nCPU核数是合理的启动值。如果在处理过程中有一些阻塞IO调用(数据库、HTTP),您可以添加使用更多线程
在多台机器上处理-群集
将处理作业提交给Spark、Hadoop、Google BigQuery等集群处理技术
在多台机器上处理-队列
您可以将记录提交到任何队列系统(Kafka、RabbitMQ、ActiveMQ等)。然后有多台机器使用队列中的项目。您可以随时添加/删除使用者。如果您不需要具有处理结果的单个位置,那么这种方法是很好的 这里可以使用并行流来执行数据的并行处理。默认情况下,并行流使用的池数比处理器数少一个线程
关于这一点,可以在这里找到广泛而有用的信息线程数由您决定。。。指定一个特定的螺纹,用于线1-10000,另一个用于线10001-20000。简单的答案是从两个线程开始。将文件一分为二。。。继续分而治之……或者,您可以尝试使用Apache Spark之类的工具,这是解决BigData类型问题的“正确解决方案”。@cricket_007我刚刚读到关于使用Hadoop MapReduce批处理数据的内容。您认为使用Hadoop MapReduce方法有效吗?这取决于您想要实现什么。MapReduce比Spark更复杂,也更具局限性。Spark不需要Hadoop,所以我个人建议从Hadoop开始。对我来说,最重要的关键词是“Measure”。不要在没有分析初始性能、找到瓶颈/最耗时的部分的情况下进行任何“优化”。