2016-12-02 2 views
0

ich habe 39 csv-dateien, die eine viel speichergröße haben. Ich möchte diese Datei per Java laden und als eine Variable setzen. Unter Absatz ist meine Codierung, die für kleine Datei funktioniert, aber nicht für große Datei funktioniert. Die Dateigröße beträgt normalerweise 100 bis 800 MB. Ich möchte 39 Datei im Verzeichnis laden und sie in ein 2d-Array legen.wie mehrere csv lesen und verschmelzen

public static String readCSV(File csvFile) { 
    BufferedReader bufferedReader = null; 
    StringBuffer stringBuffer = new StringBuffer(); 

    try { 
     bufferedReader = new BufferedReader(new FileReader(csvFile)); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 

    try { 
     String temp = null; 
     while((temp = bufferedReader.readLine()) != null) { 
      stringBuffer.append(temp+","); // temp 에 저장되어있는 한 줄을 더한다. 
     } 

     System.out.println(stringBuffer); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    // -10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,,,,,,,,,,1,2,3,4,5,6,7,8,9,10, 반환 
    return stringBuffer.toString(); 
} 

public static String[] parse(String str) { 
    String[] strArr = str.split(","); // 쉼표가 1개인 것을 기준으로 나누어서 배열에 저장 

    return strArr; 
} 

public static void main(String[] args) throws IOException { 

    //mergeCsvFiles("sample", 4, "D:\\sample_folder\\" + "merge_file" + ".csv"); 


    String str = readCSV(new File("D:/sample_folder/sample1.csv")); 
    String[] strArr = parse(str); // String 배열에 차곡차곡 담겨서 나온다. 
    int varNumber = 45; 
    int rowNumber = strArr.length/varNumber; 

    String[][] Array2D = new String[varNumber][rowNumber]; 
    for(int j=0;j<varNumber;j++) 
    { 
     for(int i=0; i<rowNumber;i++) 
      { 
       String k = strArr[i*varNumber+j]; 
         Array2D[j][i]= k; 
     } 
    }      //2D array 배열을 만들기  

    //String[][] naArray2D=removeNA(Array2D,rowNumber,varNumber); //NA 포함한 행 지우기 





//  /* 제대로 제거 됐는지 확인하는 코드 
    for(int i=0;i<varNumber;i++){ 
     for(int j=0;j<16;j++){ 
          System.out.println(Array2D[i][j]); 
     } 
         System.out.println("**********************NA제거&2차원 배열**********************"); 
    }   
//  */ 

    } 
} 

Antwort

1

Mit den Dateigrößen Sie erwähnen, Sie entweder gehen wahrscheinlich run out of memory in the JVM zu.

Dies ist wahrscheinlich warum Ihre größte Datei von 800 MB einige nicht in den Speicher geladen wird. Sie laden nicht nur 800 MB in den Speicher, sondern Sie addieren auch den Overhead des Arrays, das Sie verwenden, s. Mit anderen Worten, Sie verwenden 1600MB + all of the extra overhead cost of each array, which becomes sizeable.

Meine Wette ist, dass Sie Speichergrenzen überschreiten unter der Annahme, dass das Dateiformat in beiden Fällen perfekt ist. Ich kann zwar nicht bestätigen, dass ich Ihre JVM nicht kenne, Ihren Speicherverbrauch, aber auch nicht über die erforderlichen Ressourcen, um dies herauszufinden. Es liegt an Ihnen, ob dies der Fall ist oder nicht.

Auch ich weiß nicht - vielleicht lese ich Ihren Code richtig, aber es scheint nicht wie es tun wird, was ich denke, dass Sie es tun wollen. Vielleicht irre ich mich, ich weiß nicht genau was Sie versuchen zu tun.