Объединение двух больших текстовых файлов при сравнении чисел
Я хочу сделать большой текстовый файл из данных в двух больших текстовых файлах (около 2 или 3 ГБ), используя Java. Я должен объединить эти два файла в один, сравнивая числа в этих текстовых файлах. Один файл содержит такую информацию:
chr1 100 200 abcd +
chr2 150 227 abba +
.......................
.......................
Это не что иное, как простыня (используется в биоинформатике). И еще один файл содержит такую информацию:
>chr1:
AATTTATTTATTTTATTTTTTTATTTACCCACCCCCCCATTATTTACCAGGGGAGGGATTT
ATTTTTTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCCCCCCAATTTTTT...........
.............................................................
>chr2:
ATTTTTTTATTTACCCACCCCCCCATTATTTACCAGGGGAGGGATTTCCCCCCCCCCCCCC
ATTTTTTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCCCCCCAATTTTTT...........
.............................................................
>chr3:
AATTTATTTATTTTATTTTTTTATTTACCCACCCCCCCATTATTTACCAGGGGAGGGATTT
ATTTTTTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCCCCCCAATTTTTT...........
.............................................................
Это не что иное, как файл fasta (используемый в биоинформатике). Что мне нужно сделать, так это то, что мне нужно выбрать строку из файла bed и мне нужно извлечь последовательность из файла fasta для начальной и конечной позиции этой хромосомы (упомянутой в файлах bed 2nd и третий столбец) и создайте файл, подобный следующему:
chr1 100 200 abcd + ATTTATCC.....ATTT
chr2 150 227 abba + TTATCC.....ATTTCC
..........................................
..........................................
Я могу сделать это с небольшими файлами, и это работает. Я разделяю строки каждого входного файла и сохраняю их в двух ArrayList
s. Затем я сравниваю элементы двух ArrayList
s. Если элементы совпадают, я объединяю конкретную строку двух файлов.
Вот мой код, который работает для небольших файлов:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
public class RetrieveFromTwoFile{
private static ArrayList<String> store(String f1) throws FileNotFoundException{
Scanner read=new Scanner(new File(f1));
ArrayList<String> list =new ArrayList<String>();
while(read.hasNext()){
String temp=read.nextLine();
String[] sts=temp.split("\\s+");
for(int i=0;i<sts.length;i++){
if(!(sts[i].equals("")) && !(sts[i].equals("\n"))){
list.add(sts[i]);
}
}
}
return list;
}
private static ArrayList<String> storeLine(String f1) throws FileNotFoundException{
Scanner read=new Scanner(new File(f1));
ArrayList<String> list1 =new ArrayList<String>();
while(read.hasNext()){
String line=read.nextLine();
list1.add(line);
//return list;
}
return list1;
}
private static void writer(ArrayList<String> out,String fname) throws IOException{
FileWriter writr= new FileWriter(new File(fname));
for(int i=0;i<out.size();i++){
writr.write(out.get(i)+"\n");
}
writr.close();
}
public static void main(String [] args) throws Exception{
ArrayList<String> file1;
ArrayList<String> file2;
ArrayList<String> file3;
ArrayList<String> finl=new ArrayList<String>();
file1=store("region.txt");//storing every chunk of strings if there is space between them in region.txt
file2=store("specific.txt");//storing every chunk of strings if there is space between them in specific.txt
file3=storeLine("specific.txt");//storing each line in region.txt
for(int i=0;i<file1.size();i=i+6){//c will hold the chrome number
long initial=Long.parseLong(file1.get(i+1));
long end=Long.parseLong(file1.get(i+2));
String chrom=""+file1.get(i);
System.out.println("chrome for file1 : "+chrom);
String region=""+file1.get(i+3);
System.out.println("region for file1 : "+region);
//finl.add(region);
//finl.add(file1.get(j));
for(int x=0,z=0;x<file2.size() && z<file3.size();x=x+6,z=z+1){
long res=Long.parseLong(file2.get(x+1));//resultant number in specific.txt.this number is there after 6 more elements
String match=file2.get(x);
//boo
System.out.println("chrom type : "+chrom+" "+match);
//int index=x/6;
if(match.equals(chrom)== true){
System.out.println("hi");
if(res>=initial && res<=end){
System.out.println("hi1");
String ress=file3.get(x/6);
String finress=""+region+"\t"+ress+"";//merging line from region.txt and specific.txt
System.out.println("Initial : "+initial+" end : "+end+" item :"+res);
System.out.println("The item is :"+ress);
finl.add(finress);//adding the mergedline in another arraylist
System.out.println("The item is :"+finress);
//System.out.println("The item is :" +finl.get(z));
//flag=1;
}
}
}
System.out.println("h2i");
}
for(int i=0;i<finl.size();i++){
System.out.println("******* item is**** :"+finl.get(i));
}
writer(finl,"result.txt");//writing result.txt with the arraylist finl
//}
}
}
1 ответ
Вы можете попробовать увеличить размер вашей виртуальной памяти. Если он работает для маленьких файлов, а не для больших, то, вероятно, вам не хватает памяти. 2-3 ГБ на файл действительно огромны для текстового файла.