2014-09-02 113 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 

等等,每次更新分母。当您靠近文件末尾时,请注意整数划分边界条件。