Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中处理大型数据集的有效方法_Java_Algorithm - Fatal编程技术网

java中处理大型数据集的有效方法

java中处理大型数据集的有效方法,java,algorithm,Java,Algorithm,我有10亿条记录未排序,彼此不相关,我必须使用Java对每条记录调用函数processRecord 实现这一点的简单方法是使用for循环,但这需要很多时间 我可以想到的另一种方法是使用多线程,但问题是如何有效地划分记录数据集,以及在多少线程之间划分 有没有一种有效的方法来处理这个大数据集?度量 在决定选择哪种实现路径之前,您应该测量处理单个项目所需的时间。基于此,您可以选择提交到线程池、队列和集群的工作块的大小。非常小的工作块会增加协调开销。太大的工作块将需要很长的时间来处理,所以您将有较少的渐

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

实现这一点的简单方法是使用for循环,但这需要很多时间

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

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

度量 在决定选择哪种实现路径之前,您应该测量处理单个项目所需的时间。基于此,您可以选择提交到线程池、队列和集群的工作块的大小。非常小的工作块会增加协调开销。太大的工作块将需要很长的时间来处理,所以您将有较少的渐进式进展信息

单机处理更易于实施、故障排除、维护和推理

单机处理

使用java.util.concurrent.ExecutorService 使用
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”。不要在没有分析初始性能、找到瓶颈/最耗时的部分的情况下进行任何“优化”。