2015-09-09 2 views
-2

Я хочу сделать большой текстовый файл из данных в двух больших текстовых файлах (около 2 или 3 Гб), используя Java. Я должен объединить эти два файла в один, при сравнении чисел в этих текстовом файле files.One содержит такую ​​информацию, как это:Объединить два больших текстовых файла при сравнении чисел

chr1 100 200 abcd + 
    chr2 150 227 abba + 
    ....................... 
    ....................... 

Это не что иное, как файл кровать (используется в биоинформатике). И еще один файл содержит такую ​​информацию, как это:

>chr1: 
    AATTTATTTATTTTATTTTTTTATTTACCCACCCCCCCATTATTTACCAGGGGAGGGATTT 
    ATTTTTTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCCCCCCAATTTTTT........... 
    ............................................................. 
    >chr2: 
    ATTTTTTTATTTACCCACCCCCCCATTATTTACCAGGGGAGGGATTTCCCCCCCCCCCCCC 
    ATTTTTTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCCCCCCAATTTTTT........... 
    ............................................................. 
    >chr3: 
    AATTTATTTATTTTATTTTTTTATTTACCCACCCCCCCATTATTTACCAGGGGAGGGATTT 
    ATTTTTTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCCCCCCAATTTTTT........... 
    ............................................................. 

Это не что иное, как FASTA файл (используется в биоинформатике) Что я должен делать то, что я должен выбрать строку из файла кровати и нужно извлечь последовательность из файла Fasta для начальной и конечной позиции этой хромосоме (в упомянутой в постели файлов 2-й и третий столбец) и сделать файл как следующее:

chr1 100 200 abcd + ATTTATCC.....ATTT 
    chr2 150 227 abba + TTATCC.....ATTTCC 
    .......................................... 
    .......................................... 

я могу сделать это с маленькими файлами, и она работает. Я разделил строки каждого входного файла и сохранил их в двух ArrayList s. Затем я сравниваю элементы двух ArrayList с. Если элементы совпадают, я объединять конкретную строку этих двух файлов.

Вот мой код, который работает для небольших файлов:

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 


     //} 



    } 
} 
+0

Какой формат файлов? Вы говорите, что вам нужно сравнивать числа, это те, что для каждой строки? Разделяется специальным символом? Сколько из этих «чисел» вы можете иметь в своем файле? Нужно ли вам также учитывать значения обмана? – BigMike

+0

Компиляция для 64 бит может работать, но она может стать медленной, если у вас меньше оперативной памяти, чем 6.5 ГБ (размер файлов + 512 МБ для Java + 1 ГБ для ОС, примерно). –

+0

Если он работает с небольшими файлами, но не с большими, кажется, вам недостает памяти (или, что более кратко, используя память). Не читайте все файлы в памяти или не разбивайте их на управляемые куски. –

ответ

0

Вы можете попытаться увеличить размер виртуальной памяти. Если он работает для небольших файлов, а не для больших, то у вас, вероятно, не хватает памяти. 2-3 ГБ на файл действительно огромны для текстового файла.

+0

Нет ли других способов? –

Смежные вопросы