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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top