加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java文件i / o吞吐量下降

发布时间:2020-12-15 08:34:30 所属栏目:Java 来源:网络整理
导读:我有一个程序,其中每个线程一次从文件中读取多行文件,处理行,并将行写入不同的文件.四个线程分割要在其中处理的文件列表.我在两种情况下遇到了奇怪的性能问题: 四个文件,每个文件50,000行 吞吐量从700线/秒开始处理,下降到~100线/秒 30,000个文件,每个12行
我有一个程序,其中每个线程一次从文件中读取多行文件,处理行,并将行写入不同的文件.四个线程分割要在其中处理的文件列表.我在两种情况下遇到了奇怪的性能问题:

>四个文件,每个文件50,000行

>吞吐量从700线/秒开始处理,下降到~100线/秒

> 30,000个文件,每个12行

>吞吐量从800线/秒开始并保持稳定

这是我正在处理的内部软件,所以遗憾的是我无法共享任何源代码,但该程序的主要步骤是:

>拆分四个工作线程中的文件列表
>开始所有线程.
>线程一次最多读取100行并存储在String []数组中.
> Thread将转换应用于数组中的所有行.
>线程将行写入文件(与输入文件不同).
每个线程重复3-5次,直到完全处理完所有文件.

我不明白的是为什么每行12行的30k文件比一些多行文件的性能更高.我本以为打开和关闭文件的开销要大于读取单个文件的开销.此外,前一案件的表现下降具有指数性质.

我已将最大堆大小设置为1024 MB,并且最多使用100 MB,因此过载的GC不是问题.你还有其他建议吗?

解决方法

根据你的数字,我猜GC可能不是问题.我怀疑这是磁盘的正常行为,由许多并发线程操作.当文件很大时,磁盘必须多次在线程之间切换上下文(产生重要的磁盘 seek time),并且开销很明显.对于小文件,可能它们被读作单个块而没有额外的寻道时间,因此线程不会相互干扰太多.

使用单个标准磁盘时,串行IO通常比并行IO更好.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读