多執行緒+讀寫流+jvm溢位解決
阿新 • • 發佈:2018-12-15
題目:讀取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, threadn, 0L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new NamedThreadFactory("thread"));
通知執行緒:進行合併計算 cb = new CyclicBarrier(threadn, () -> { long end = System.currentTimeMillis() - start; System.out.println("計算完畢 時間是: " + end); });