我有一个程序,其中每个线程从文件中一次性读入很多行数据,处理这些行,并将它们写入另一个文件。四个线程将要处理的文件列表分别拆分成四份。我在两种情况下遇到了奇怪的性能问题:
- 四个文件,每个文件有50,000行
- 吞吐量从每秒处理700行开始下降到大约100行/秒
- 30,000个文件,每个文件有12行
- 吞吐量从每秒处理800行开始保持稳定
这是我正在开发的内部软件,所以不能分享任何源代码,但程序的主要步骤如下:
1. 将文件列表分为四个工作线程的任务清单。 2. 启动所有线程。 3. 线程一次性读取最多100行,存储在`String[]`数组中。 4. 线程对数组中的所有行进行转换。 5. 线程将行写入一个文件(与输入文件不同)。 6. 步骤3至5重复,直到所有文件都被处理完毕。
我不理解的是,为什么30k个每个文件只有12行的文件可以比几个有很多行的文件更高效。我本来期望文件的打开和关闭开销比读取单个文件的开销更大。此外,在前一种情况下性能的下降呈指数增长。
我将最大堆大小设置为1024 MB,它似乎最多只使用了100 MB,所以过度的垃圾回收不是问题。你有其他的想法吗?
- 四个文件,每个文件有50,000行
- 吞吐量从每秒处理700行开始下降到大约100行/秒
- 30,000个文件,每个文件有12行
- 吞吐量从每秒处理800行开始保持稳定
这是我正在开发的内部软件,所以不能分享任何源代码,但程序的主要步骤如下:
1. 将文件列表分为四个工作线程的任务清单。 2. 启动所有线程。 3. 线程一次性读取最多100行,存储在`String[]`数组中。 4. 线程对数组中的所有行进行转换。 5. 线程将行写入一个文件(与输入文件不同)。 6. 步骤3至5重复,直到所有文件都被处理完毕。
我不理解的是,为什么30k个每个文件只有12行的文件可以比几个有很多行的文件更高效。我本来期望文件的打开和关闭开销比读取单个文件的开销更大。此外,在前一种情况下性能的下降呈指数增长。
我将最大堆大小设置为1024 MB,它似乎最多只使用了100 MB,所以过度的垃圾回收不是问题。你有其他的想法吗?