2010-06-11 65 views
4

我想讀一個大的文本文件,我決定創建四個線程並讀取每個文件的25%。 然後加入他們。我想讀一個大的文本文件

但它不是更令人印象深刻。 任何人都可以告訴我可以使用併發編程。 作爲我的文件結構有一些數據爲 名稱聯繫compnay policyname policynumber uniqueno

我想最後把所有的數據放在hashmap中。

感謝

回答

0

那麼,你可能會刷新磁盤緩存,把一個高爭上HashMap中的同步,如果你那樣做。我建議你只是確保你已經正確地緩衝了流(可能有一個很大的緩衝區大小)。使用BufferedReader(Reader in, int sz)構造函數指定緩衝區大小。

如果瓶頸不解析行(即瓶頸不是CPU使用情況),則不應按所述方式對任務進行並行化。

您還可以查看內存映射文件(可通過nio軟件包獲得),但這可能僅適用於想要有效讀取並編寫文件。有源代碼的教程可以在這裏找到:http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ314_029.htm

1

如果這是一個很大的文件可能是它被寫入磁盤作爲一個連續的部分和「流」的數據將比平行讀取更快,因爲這將開始移動來回走動。要知道什麼是最快的,您需要深入瞭解目標生產環境,因爲在高端存儲上,數據可能分佈在多個磁盤上,並行讀取可能會更快。

最好的辦法是我認爲是閱讀大塊進入內存。使其可用作ByteArrayInputStream來執行解析。

很可能你會在解析和處理數據時掛鉤CPU。也許並行map-reduce可以在這裏幫助傳播所有內核的負載。

+0

「如果這是一個大文件的機會,它被寫入磁盤作爲一個連續的部分」 - 你的意思是它的機會是*不*連續? – 2010-06-11 11:50:07

+0

我的意思是它可能是連續的。磁盤碎片化,條帶化可能會影響到這一點。在大多數情況下,磁盤系統針對快速順序讀取進行了優化 – 2010-06-11 14:40:52

9

讀取大文件通常受限於I/O性能,而不受CPU時間的限制。你不能通過分成多個線程來加快閱讀速度(它會降低性能,因爲它仍然是相同的文件,在同一個驅動器上)。您可以使用併發編程來處理數據,但只能在讀取文件後提高性能

但是,通過專用單線程來讀取文件,您可能會有一些運氣,並且只要讀取了數據單元,就可以將實際的處理從該線程委託給工作線程。

+0

如果將塊中的文件分開並通過不同的線程讀取,並獲取併發收集中的數據。這是增加性能 – Pedantic 2010-06-11 12:04:27

+0

如果我理解正確,你還在談論從多個線程讀取文件?如果是這樣,這不會提高性能。讓一個線程讀取文件並將一個塊傳遞給一個空閒的工作線程(使用作業隊列或類似的東西)。這樣你就可以使用所有的處理能力進行數據處理。另一方面,您可能想使用分析器來找出瓶頸實際存在的位置。 – OregonGhost 2010-06-11 12:43:53

+0

謝謝我想我的方式.. – Pedantic 2010-06-11 13:01:31

0

也可以使用大的緩衝

或使用該

進口java.io.

http://java.sun.com/developer/technicalArticles/Programming/PerfTuning/

OR

需要幫助從下面的鏈接*;

公共類的LINE-1 {

public static void main(String args[]) { 
    if (args.length != 1) { 
    System.err.println("missing filename"); 
    System.exit(1); 
    } 
    try { 
    FileInputStream fis = 
     new FileInputStream(args[0]); 
    BufferedInputStream bis = 
     new BufferedInputStream(fis); 
    DataInputStream dis = 
     new DataInputStream(bis); 
    int cnt = 0; 
    while (dis.readLine() != null) 
     cnt++; 
    dis.close(); 
    System.out.println(cnt); 
    } 
    catch (IOException e) { 
    System.err.println(e); 
    } 
} 

}

1

您可能需要使用內存映射文件的緩衝區(NIO)而不是純java.io.

相關問題