Campionamento del serbatoio basato sul tempo in Java?
Domanda
Ho ideato un modo per fare il campionamento del serbatoio in Java, il codice che ho usato è qui . Ho inserito un file enorme da leggere ora e ci vogliono circa 40 secondi per leggere il lotto prima di mettere i risultati sullo schermo, quindi leggendo il lotto.Il file è troppo grande per archiviare in memoria e scegliere un campione casuale da quello.
Speravo che avrei potuto scrivere un extra mentre loop lì per farcela fuori mettere il mio reservoirList
in un determinato periodo di tempo e non solo dopo aver finito la scansione del file.
Qualcosa come:
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;
.
Ma questo emette un grappolo (non tutta la lunghezza della mia serbatoio) di linee e poi un flusso intero (poche centinaia?) della stessa linea.
C'è un modo più elegante per farlo?Uno che, forse, funziona se possibile.
Soluzione
Ho ingannato.Per ora sto emettendo ogni x linee leggere dal file, dove x è abbastanza grande da darmi un buon ritardo di tempo tra ogni campione.Io uso il conteggio dal programma di campionamento per allenarsi quando questo è.
do {
//sampling which includes a count++
}while(count%5000!=0)
.
Una nota finale, I Intialisise conta fino a 1 per interrompere la produzione delle prime dieci linee come campione.
Se qualcuno ha una soluzione migliore, basata sul tempo, fammi sapere.