Таким образом, у меня есть большие (около 4 гигабайт каждый) текстовые файлы в парах, и мне нужно создать третий файл, который будет состоять из 2 файлов в режиме перемешивания.Следующее уравнение представляет это лучше всего:
3rdfile = (4 строки из файла 1) + (4 строки из файла 2), и это повторяется, пока я не достигну конца файла 1 (оба входных файла будут одинаковымидлина - это по определению).Вот код, который я сейчас использую, но он не очень хорошо масштабируется для больших файлов.Мне было интересно, есть ли более эффективный способ сделать это - поможет ли работа с отображенным файлом памяти?Все идеи приветствуются.
public static void mergeFastq(String forwardFile, String reverseFile, String outputFile) {
try {
BufferedReader inputReaderForward = new BufferedReader(new FileReader(forwardFile));
BufferedReader inputReaderReverse = new BufferedReader(new FileReader(reverseFile));
PrintWriter outputWriter = new PrintWriter(new FileWriter(outputFile, true));
String forwardLine = null;
System.out.println("Begin merging Fastq files");
int readsMerge = 0;
while ((forwardLine = inputReaderForward.readLine()) != null) {
//append the forward file
outputWriter.println(forwardLine);
outputWriter.println(inputReaderForward.readLine());
outputWriter.println(inputReaderForward.readLine());
outputWriter.println(inputReaderForward.readLine());
//append the reverse file
outputWriter.println(inputReaderReverse.readLine());
outputWriter.println(inputReaderReverse.readLine());
outputWriter.println(inputReaderReverse.readLine());
outputWriter.println(inputReaderReverse.readLine());
readsMerge++;
if(readsMerge % 10000 == 0) {
System.out.println("[" + now() + "] Merged 10000");
readsMerge = 0;
}
}
inputReaderForward.close();
inputReaderReverse.close();
outputWriter.close();
} catch (IOException ex) {
Logger.getLogger(Utilities.class.getName()).log(Level.SEVERE, "Error while merging FastQ files", ex);
}
}