题目:读取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