2014-09-02 62 views
0

我需要從文件中取樣行(文件太大而無法載入內存)。 我使用的BufferedReader這個剪斷:Java從文件讀取行樣本

BufferedReader br = new BufferedReader(new FileReader(filename)); 
    String line; 
    long counter = 0; 
    while ((line = br.readLine()) != null && DocCounter < 50000) {} 

我怎樣才能調整代碼從文件中隨機抽樣50000行? 感謝

回答

0

試試這個對於任何隨機值,然後在你的情況下,將其更改爲5000:

String line = reader.readLine(); 
for (int i = 0; i < randomInt + 1; i++) { 
    line = reader.readLine(); 
} 
+0

這不正是我在我的代碼中所做的嗎?我有一個名爲「DocCounter」的計數器,當它達到50000時,它存在循環。然而,在這裏沒有任何東西,它只是取第50000行 – user3628777 2014-09-02 11:25:10

+0

你可能想嘗試索引文件閱讀器https://github.com/jramoyo/indexed-file-reader有readLines的方法 – kiaGh 2014-09-02 11:34:00

0

要隨機抽樣50000行,你必須知道行的文件中的總數量,以便您可以分發整個文件中的樣本(並確保您不會太早用完)。

的基本方法是定義一個初始跳過值

k = n/50000 

其中n是行的總數。然後依次通過在文件中的範圍

s = k ± e 

其中e產生隨機數爲k的一些部分。在每次迭代時跳過s行,對一行進行採樣,然後根據跳過後剩餘的行數重新計算k。即第一次迭代後

t += s+1 
k = (n-t)/49999 

等等,每次更新分母。當您靠近文件末尾時,請注意整數劃分邊界條件。