2015-06-05 27 views
4

有人問我在接受採訪時這樣基本的問題,我不能回答:在多線程應用程序中劃分大文件?

我們怎麼可以把多線程來處理這之間的一個大的文件?如果 我們正在運行多線程應用程序,並且輸入是一個大文件 ,我們必須爲每個線程提供文件的一部分以使其更快。 我們如何在Java中實現它?

任何人都可以解釋我如何做到這一點?任何例子也將不勝感激。

+0

你見過這個答案:http://topicoverflow.com/questions/17927398/how-to-split-a-large-text-file-into-smaller-chunk-using-java-multithread' – Babel

+0

^請做一個鏈接。 – Skynet

+0

這裏有一個謬誤。磁盤和文件因此不是多線程的。多線程是否會更快,這是值得懷疑的。可能較慢。 – EJP

回答

1

得到3個起始位置

File f = new File("xxx"); 
    long size = f.length(); 
    long p1 = 0; 
    long p2 = f.length()/3; 
    long p3 = p2 + f.length()/3; 

通行證位置和長度以讀取線程,移動文件,以

FileInputStream is = new FileInputStream("xxx"); 
    FileChannel c= is.getChannel(); 
    c.position(position); 
    // read ... 
+0

你的意思是'長p3 = f.length() - p2;'你的方式,'p2 == p3'。 – EJP

+0

long p3 = p2 + f.length()/ 3;這應該是 –

+0

謝謝你添加一個例子。如果可能的話,你可以逐步添加更多解釋,這將如何工作?這裏的意思是什麼?我之前從未使用過'position'和'FileChannel',所以任何一步一步的解釋都會很有幫助。 – john

1

定位和讀取n個字節在採訪的反應應該是,這是一個消費者 - 生產者問題。 因此,您應該有1個生產者線程讀取文件,並將這些行放入同步集合(如Vector)中,並且您可以讓n個消費者線程從集合中獲取線並處理它們。

如果有助於準備另一次面試,問題可能是:超線程,死鎖,忙碌的等待。

有一些面試書籍,如破解代碼訪談,或Java編程訪談公開。