【问题标题】:Splitting a file in Java for Multithreading在Java中拆分文件以进行多线程处理
【发布时间】:2015-08-15 12:08:43
【问题描述】:

对于我正在进行的一个项目,我正在尝试尽可能快地计算文本文件中的元音。为了做到这一点,我正在尝试一种并发方法。我想知道是否可以同时读取文本文件以加快计数速度?我相信瓶颈是 I/O,因为现在我正在通过缓冲读取器读取文件并逐行处理,所以我想知道是否可以一次读取文件的多个部分。

我最初的想法是使用 Split File - Java/Linux

但显然 MappedByteBuffers 在性能方面并不是很好,一旦我拆分,我仍然需要从每个 MappedByteBuffer 中逐行读取。

另一种选择是在读取一定数量的行后进行拆分,但这违背了目的。

不胜感激。

【问题讨论】:

  • 这部分是你程序中最耗时的部分吗?也许你可以缓存它。
  • 除非您有一个非常大的 RAID 0 阵列或一个或多个 SSD 驱动器,否则同时读取文件只会导致磁盘抖动并减慢您的应用程序。鉴于您的处理任务非常简单(快速读取),您不太可能从线程中获益,因为您受 IO 限制而不是 CPU 限制。
  • as fast as possible 你能解释一下为什么吗?只读取文件有什么问题?
  • @huseyintugrulbuyukisik 是的!剩下的就是超级快速的元音计数......
  • 在 Java 中,一个逻辑字符不适合一个 char,所以你有一个“代码点”的想法,它是一个 int。你看,问题是一些chars 是“特殊的”并且只用于修改他们的邻居。因此,为了找到代码点,您需要确定您查看的是surrogate char 还是普通代码点。这一切都很快变得相当混乱......Further reading.

标签: java multithreading file io filesplitting


【解决方案1】:

以下内容不会拆分文件 - 但可以帮助同时处理它!

在 Java 8 中使用 Streams,您可以执行以下操作:

Stream<String> lines = Files.lines(Paths.get(filename));
lines.filter(StringUtils::isNotEmpty) // ignore empty lines

如果你想并行运行,你可以这样做:

lines.parallel().filter(StringUtils::isNotEmpty) 

在上面的示例中,我过滤了空行 - 当然您可以通过实现自己的方法并调用它来修改它以适应您的使用(计算元音)。

【讨论】:

  • 这将“缓冲”文件中的一些行,并将每个块传递到管道的其余部分,并行处理 - 生产者/消费者模式 (ish) 的示例。 Marko Topolnik 有一个very good article 了解这一切是如何运作的。简而言之,除非处理运行相当缓慢,否则默认行为不会是理想的。
  • @BoristheSpider 感谢您的链接 - 我今晚会检查一下!
猜你喜欢
  • 2019-01-05
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多