Si conoce el número de líneas en su archivo y si está aleatorizando filas completas, puede aleatorizar por número de línea y luego leer esa fila seleccionada. Simplemente seleccione una línea al azar a través de la clase Random y almacene la lista de números aleatorios, para que no elija uno dos veces.
BufferedReader reader = new BufferedReader(new FileReader(new File("file.cvs")));
BufferedWriter chosen = new BufferedWriter(new FileWriter(new File("chosen.cvs")));
BufferedWriter notChosen = new BufferedWriter(new FileWriter(new File("notChosen.cvs")));
int numChosenRows = 10000;
long numLines = 1000000000;
Set<Long> chosenRows = new HashSet<Long>(numChosenRows+1, 1);
for(int i = 0; i < numChosenRows; i++) {
while(!chosenRows.add(nextLong(numLines))) {
// add returns false if the value already exists in the Set
}
}
String line;
for(long lineNo = 0; (line = reader.readLine()) != null; lineNo++){
if(chosenRows.contains(lineNo)){
// Do nothing for the moment
} else {
notChosen.write(line);
}
}
// Randomise the set of chosen rows
// Use RandomAccessFile to write the rows in that order
Ver this answer para el método nextLong, que produce una aleatoria larga reducido a un tamaño particular.
Editar: Como la mayoría de las personas, pasé por alto el requisito de escribir las líneas seleccionadas al azar en un orden aleatorio. Supongo que RandomAccessFile me ayudaría con eso. Simplemente aleatorice la Lista con las filas elegidas y acceda a ellas en ese orden. En cuanto a los no elegidos, edité el código anterior para simplemente ignorar los elegidos.
Podría mapear la memoria del archivo y leer partes del archivo. – Thomas
Parece que necesita más memoria. :-) – nfechner
@Thomas No creo que ese sea el problema. El póster necesita mantener todas las entradas en la memoria, si quiere aleatorizarlas antes de escribirlas en el archivo. – nfechner