使用java语言,怎样提高大批量文件的读吞吐量

旗舰 发布于 2014/07/08 15:50
阅读 1K+
收藏 1

使用java语言读文件,单个文件大小在10KB左右;

有一个读的根目录,其他系统会不断的写文件到这个目录,本地系统会有个调度器,定时调度处理器去扫描这个根目录中的文件。有时极端情况,有10几万之多文件

【现在的处理器机制】:现在的处理器的处理机制是:单进程调度,有一个容器会发现文件并分派多线程处理文件任务。单个任务读一个文件时,给这个文件加一个锁【锁是房子redis中的,redis服务装在同台机器上】,读完释放锁

现请教,怎样提高文件读的吞吐能力,即单位时间的文件处理个数。

【软件运行环境】:suse linux 10, IBM M4 24CPU(物理2个),32GB MEM,应用的内存为8GB


加载中
0
p
polaris_chen
单纯的读吗?如果还需要做点计算耗cpu的话,推荐你试试异步IO  。 可以提高并发量,但是对于纯IO操作性能不会提高多少。
p
polaris_chen
回复 @旗舰 : 不是,异步IO也可以针对读。
旗舰
旗舰
业务计算就是,处理文件的每一行数据,现在每个文件都有1000行,单个文件大小大概500KB 异步IO,你指的是写数据吗? 不是的,我现在不写数据,仅读加一些业务分析,且计算量并不复杂
0
sxgkwei
sxgkwei

现在的方案,已经是总体结构的最优结构了吧?如果还要优化,只能在“文件处理”这个环节上想办法了,如果是数据文件,读出数据再写入数据库,可以考虑在各个线程读完之后,把数据都丢到一个容器里面去,容器则自己包揽达到多少条数据时批量往数据库写一次数据,然后清理自身,外加对写入数据库间隔时间的最大限制;而不是每个线程内部读一条数据写一次数据库;这样的话就可以很好的提高效率。如果是对文件的转换或者其它处理的话,可以考虑对文件进行切分处理;在线程内再起线程去拿到切分的小块,然后处理完了合并小块;但我想每个只有10K左右,也不用这种折腾了吧。

旗舰
旗舰
数据处理有批量设置的; 单文件就1000行,文件内部再切分成块,调用线程执行,是不是太复杂了啊, 小小鸟水平,掌控不了啊!!
0
PengKangde
PengKangde
“给这个文件加一个锁”没看明白 读取为什么要加锁  使用nio内存映射读取 设置一个恰当的缓存大小  如果数据可以不用utf-8解码 那就不要用utf-8 或自定义编码表  编码表可以缩小但要对的上标准码表的码值  也可以把文件分散到多个磁盘相当于增大IO   注意看操作系统IO监控 
旗舰
旗舰
"加锁" 是防止重复读取处理的意思
0
xiaoE7
xiaoE7
我们最近也处理了比你这个还要大的文件处理 都是txt文件,光文件都上百万,这个处理上是很慢,其实个人感觉这个最高上线都是有瓶颈,除了硬件只能用多线程去处理
xiaoE7
xiaoE7
@旗舰 10K左右
旗舰
旗舰
你单个文件大小是多少呢?
0
Brin想写程序
Brin想写程序

我这边的解决方案是直接把小文件扔redis里面。其他系统通过我给的http接口,将小文件写入redis。

然后用rpop和lpush来做队列。

0
ksfzhaohui
ksfzhaohui
你这个算是io密集型吧,可以适当增加线程数量
0
jiyilee
jiyilee
若写不能控制,应该在扫描及单文件读取两个IO操作上优化,不过应还是增加CPU和内存的利用上想法子,如减少不必要的资源(时间)开销等。。。
返回顶部
顶部