Pergunta

Eu desenvolvi uma maneira de fazer amostragem de reservatório em java, o código que usei é aqui.

Coloquei um arquivo enorme para ser lido agora e leva cerca de 40 segundos para ler o lote antes de colocar os resultados na tela e depois ler o lote novamente.O arquivo é muito grande para ser armazenado na memória e basta escolher uma amostra aleatória dele.

Eu esperava poder escrever um loop while extra lá para fazer com que ele saísse do meu reservoirList em um determinado período de tempo, e não apenas após concluir a verificação do arquivo.

Algo como:

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;

Mas isso gera um monte de linhas (não o comprimento total do meu ReservoirList) e, em seguida, um fluxo inteiro (algumas centenas?) Da mesma linha.

Existe uma maneira mais elegante de fazer isso?Um que, talvez, funcione, se possível.

Foi útil?

Solução

Eu trapaceei.Por enquanto, estou exibindo todas as X linhas lidas do arquivo, onde X é grande o suficiente para me proporcionar um bom atraso entre cada amostra.Eu uso a contagem do programa de amostragem para descobrir quando isso acontece.

do {
    //sampling which includes a count++
}while(count%5000!=0)

Uma nota final: eu inicializo a contagem até 1 para impedir a saída das primeiras dez linhas como amostra.

Se alguém tiver uma solução melhor, baseada no tempo, me avise.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top