1. 程式人生 > >多執行緒+讀寫流+jvm溢位解決

多執行緒+讀寫流+jvm溢位解決

題目:讀取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);

});