我有一個gz格式的1000個文件的集合。我想平行處理它們,每輪8個。當我讓每個線程打開一個文件並從磁盤讀取時,由於許多進程嘗試從不同位置讀取,導致顯着的延遲。在java中緩衝輸入文件和並行處理
我只是想知道是否有一個有效的方法來處理多個文件讀取?或者我應該先將所有文件緩衝到內存中(例如,所有8個文件,然後將緩衝區交給線程)。如果是這樣,緩衝文件的最佳方式是什麼? bufferArray?或一些替代結構?
謝謝。
我有一個gz格式的1000個文件的集合。我想平行處理它們,每輪8個。當我讓每個線程打開一個文件並從磁盤讀取時,由於許多進程嘗試從不同位置讀取,導致顯着的延遲。在java中緩衝輸入文件和並行處理
我只是想知道是否有一個有效的方法來處理多個文件讀取?或者我應該先將所有文件緩衝到內存中(例如,所有8個文件,然後將緩衝區交給線程)。如果是這樣,緩衝文件的最佳方式是什麼? bufferArray?或一些替代結構?
謝謝。
如果你使用固定大小的池8(因爲你有8個內核),你可能會發現這是相當高效的,因爲解壓文件是cpu密集型的。
但是,您可能會發現這不會比使用4個線程或只有2個線程更快,因爲真正的瓶頸是從磁盤讀取數據。如果是這種情況,你唯一能做的就是獲得一個更快的磁盤。例如鏡像磁盤或使用速度可提高20倍的SSD。
我懷疑你用1000個線程淹沒你的進程。線程不是特別輕量級的(例如,每個線程將默認佔用512k的堆棧空間)。
一個更有效率的模型可能是使用線程池(通過ThreadPoolExecutor)並調整它以獲得系統上同時線程的最佳數量(例如,您已經提出了8個以上 - 我建議這取決於某種程度關於您擁有的免費CPU數量)。
每個.gz
文件將由提交給執行者的一個Callable
表示,並且執行程序將照看同時運行多個作業。
謝謝大腦。這就是我現在正在執行的基於空閒cpus數量的固定池大小,每個文件都用Callable表示。這不是有效的。 – DotNet 2012-08-07 11:57:17
謝謝彼得。你是對的。 – DotNet 2012-08-07 11:59:22