【发布时间】:2010-07-06 21:05:08
【问题描述】:
我有一个程序,其中每个线程一次从文件中读取多行文件,处理这些行,然后将这些行写到不同的文件中。四个线程在其中拆分要处理的文件列表。我在两种情况下遇到了奇怪的性能问题:
- 四个文件,每个文件 50,000 行
- 处理量从 700 行/秒开始,下降到 ~100 行/秒
- 30,000 个文件,每个文件 12 行
- 吞吐量开始时约为 800 行/秒并保持稳定
这是我正在开发的内部软件,很遗憾我无法分享任何源代码,但该程序的主要步骤是:
- 在四个工作线程之间拆分文件列表
- 启动所有线程。
- 线程一次最多读取 100 行并存储在
String[]数组中。 - 线程将转换应用于数组中的所有行。
- 线程将行写入文件(与输入文件不同)。
- 每个线程重复 3-5 次,直到所有文件完全处理完毕。
我不明白为什么每个 12 行的 30k 个文件比每个有很多行的几个文件给我更好的性能。我本来希望打开和关闭文件的开销大于读取单个文件的开销。此外,前一种情况的性能下降是指数级的。
我已将最大堆大小设置为 1024 MB,而且它似乎最多使用 100 MB,因此负担过重的 GC 不是问题。您还有其他想法吗?
【问题讨论】:
标签: java performance multithreading file-io