我已经设计了一种在java中进行水库采样的方法,我使用的代码是here。
我已经放入了一个大文件,现在可以读取,在将结果输出到屏幕之前需要大约40秒才能读完,然后再次阅读。该文件太大,无法存储在内存中,只需从中选择一个随机样本。
我希望我可以在那里写一个额外的while循环来让它在我设定的时间段内放置reservoirList
,而不是在它完成扫描文件之后。
类似的东西:
long startTime = System.nanoTime();
timeElapsed = 0;
while(sc.hasNext()) //avoid end of file
do{
long currentTime = System.nanoTime();
timeElapsed = (int) TimeUnit.MILLISECONDS.convert(startTime-currentTime,
TimeUnit.NANOSECONDS);
//sampling code goes here
}while(timeElapsed%5000!=0)
return reservoirList;
} return reservoirList;
但是这会产生一堆(不是我的ReservoirList的全长)行,然后输出同一行的整个流(几百?)。
有更优雅的方法吗?也许,如果可能的话,也许会有效。
答案 0 :(得分:0)
我被骗了。现在我输出从文件读取的每一行X,其中X足够大,以便在每个样本之间给我一个很好的时间延迟。我使用抽样程序中的计数来确定这个时间。
do {
//sampling which includes a count++
}while(count%5000!=0)
最后一点,我初始化为1,以阻止它输出前十行作为样本。
如果有人有更好的,基于时间的解决方案,请告诉我。