多线程+读写流+jvm溢出解决

本文探讨了在处理大量数据(如10GB)时,如何利用多线程和读写流进行高效计算,以避免JVM内存溢出。通过在字节流和字符流中使用缓冲提高效率,并根据JVM默认内存设置(最大1.5GB)调整数据分批加载策略,采用8线程计算,实现了在10秒内完成10GB数据的求和操作。
摘要由CSDN通过智能技术生成

题目:读取10G的数据求和。

              1.流的基本知识:

è¿éåå¾çæè¿°

           字节流和字符流最大区别在,字符流在文件和流中间加了一层缓存。有人说用最好用字节流,速度上我感觉没得到很高提升,主要大多数文件缺失以字节存储比如  视屏,图片。。。。

用那一个?统一用带Buffered    ,一:效率更高。二:方法更全   

 

                2.jvm  内存限制。通常情况下jvm 的默认设置是最大空间是物理内存1/4  ,最小空间是物理内存的1/64 。本机是6G,所以jvm可以得到的最大内存是1.5G.一次加载10G的内容死啦死啦的。Oom是铁定跑不了。一台机器如何最快的求和。那么就分批次加载,为了最大的利用本机效能,一次读取1.5G  并分别在8线程上分别计算汇总。显然如果分别7台机子,最快2秒内就能计算完,流的反复读取是很耗时间的。但是大概10秒内也能完成10G数据统计。

如下工具进行分片:读取
raf = new RandomAccessFile(prth, "r");
MappedByteBuffer map = raf.getChannel().map(FileChannel.MapMode.READ_ONLY, offset, TSize);
线程池申请:最合适是当前cpu*2     
private static ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(threadn,
        threa
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值