4

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

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

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

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

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

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

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

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

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

请在这里提供有价值的想法

非常感谢

4

2 回答 2

2

为什么不利用已经可用的东西,并使用 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(),并且您无法真正自定义它以实现最大性能,但人们似乎也找到了解决方法,这里有一些关于该主题的内容

于 2015-05-07T19:21:12.230 回答
0

备选方案 2 看起来不错。我只想改变一件事。尽可能阅读最大的文件块。如果你在小范围内进行,IO 将是一个问题。由于有几个文件,我会创建一个演员来获取文件的名称,读取特定的文件夹。然后它将每个文件的路径发送到LogLineReader. 它将读取文件的一大块。最后它会将每一行发送到LogLineProcessActor. 请注意,他们可能会乱序处理这些行。如果这不是问题,它们将使您的 CPU 保持忙碌。

如果您喜欢冒险,也可以尝试新的akka 流 1.0

于 2015-05-08T10:58:44.877 回答