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

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

替代1
-打开文件(同步),读取每一行,生成POJO

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

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

替代2
-打开文件(同步),读取N行(N是可配置的),并传递给不同的参与者进行处理
                                                    / LogLineProcessActor 1
FileActor -> LogLineProcessRouter (with 10 Actors) -- LogLineProcessActor 2
                                                    \ LogLineProcessActor 10

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

问题
-以上选择中的任何一个是不错的选择吗?
-还有更好的选择吗?

请在这里提供宝贵的想法

非常感谢

最佳答案

为什么不利用jdk 1.8附带的已有功能,并使用paralell流功能?我将从这样的事情开始,看看它是如何工作的:

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

09-10 04:13
查看更多