gpt4 book ai didi

java - 并行文件处理 : What are recommended ways?

转载 作者:搜寻专家 更新时间:2023-11-01 03:21:16 26 4
gpt4 key购买 nike

这是设计和代码问题的结合。

用例
- 给定范围 (2MB - 2GB) 内的许多日志文件,我需要解析这些日志中的每一个并应用一些处理,生成 Java POJO
- 对于这个问题,假设我们只有 1 日志文件
- 此外,我们的想法是充分利用 System.多核可用。

备选方案 1
- 打开文件(同步),读取每一行,生成POJO

FileActor -> read each line -> List<POJO>  

优点:易于理解
缺点:串行进程,没有利用系统中的多核

备选方案 2
- 打开文件(同步),读取N 行(N 是可配置的),传递给不同的参与者进行处理

                                                    / LogLineProcessActor 1
FileActor -> LogLineProcessRouter (with 10 Actors) -- LogLineProcessActor 2
\ LogLineProcessActor 10

优点 一些并行化,通过使用不同的参与者来处理部分线路。 Actor 将利用系统中的可用核心(?如何,可能?)
缺点 仍然是串行的,因为文件以串行方式读取

问题
- 以上选择是否是一个不错的选择?
- 有更好的选择吗?

请在这里提供宝贵的意见

非常感谢

最佳答案

为什么不利用已经可用的东西,并使用 jdk 1.8 附带的并行流东西?我会从这样的事情开始,看看它的表现如何:

Files.lines(Paths.get( /* path to a log file */ ))
.parallel() // make the stream work paralell
.map(YourBean::new) // Or some mapping method to your bean class
.forEach(/* process here the beans*/);

您可能需要对线程池进行一些调整,因为默认情况下 paralell() 是使用 ForkJoinPool.commonPool() 执行的,您无法真正自定义它以实现最佳性能,但人们似乎也为此找到了解决方法,some stuff about the topic here .

关于java - 并行文件处理 : What are recommended ways?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30109438/

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