4

巨大なcsvファイルを読みたい。一般に、ファイルを解析するために superCSV を使用しています。この特定のシナリオでは、ファイルが巨大で、明らかな理由でメモリ不足の問題が常に発生します。

最初のアイデアは、ファイルをチャンクとして読み取ることですが、これが superCSV で機能するかどうかはわかりません。ファイルをチャンクすると、最初のチャンクだけがヘッダー値を持ち、CSV Bean にロードされ、他のチャンクはヘッダー値がなく、例外がスローされる可能性があると感じています。そう

a) 私の思考プロセスが正しいかどうか疑問に思っていました
b) この問題にアプローチする他の方法はありますか?

だから私の主な質問は

superCSV には大きな csv ファイルを処理する機能がありますか。superCSV は BufferedReader を介してドキュメントを読み取ることがわかります。しかし、バッファのサイズがわからないので、必要に応じて変更できますか?

@Gilbert Le Blanc私はあなたの提案に従って小さなチャンクに分割しようとしましたが、巨大なファイルを小さなチャンクに分割するには長い時間がかかります. これが私がそれを行うために書いたコードです。

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.LineNumberReader;

public class TestFileSplit {

public static void main(String[] args) {

    LineNumberReader lnr = null;
    try {
        //RandomAccessFile input = new RandomAccessFile("", "r");
        File file = new File("C:\\Blah\\largetextfile.txt");
        lnr = new LineNumberReader(new FileReader(file), 1024);
        String line = "";
        String header = null;
        int noOfLines = 100000;
        int i = 1;
        boolean chunkedFiles = new File("C:\\Blah\\chunks").mkdir();
        if(chunkedFiles){
            while((line = lnr.readLine()) != null) {
                if(lnr.getLineNumber() == 1) {
                    header = line;
                    continue;
                }
                else {
                    // a new chunk file is created for every 100000 records
                    if((lnr.getLineNumber()%noOfLines)==0){
                        i = i+1;
                    }

                    File chunkedFile = new File("C:\\Blah\\chunks\\" + file.getName().substring(0,file.getName().indexOf(".")) + "_" + i + ".txt");

                    // if the file does not exist create it and add the header as the first row
                    if (!chunkedFile.exists()) {
                        file.createNewFile();
                        FileWriter fw = new FileWriter(chunkedFile.getAbsoluteFile(), true);
                        BufferedWriter bw = new BufferedWriter(fw);
                        bw.write(header);
                        bw.newLine();
                        bw.close();
                        fw.close();
                    }

                    FileWriter fw = new FileWriter(chunkedFile.getAbsoluteFile(), true);
                    BufferedWriter bw = new BufferedWriter(fw);
                    bw.write(line);
                    bw.newLine();
                    bw.close();
                    fw.close();
                }
            }
        }
        lnr.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
    }
}
}   
4

2 に答える 2

1

質問の意味がわかりません。一度に 1 行ずつ Bean として読み取るには、ほぼ一定のメモリ消費量が必要です。すべての読み取りオブジェクトを一度に保存すると、はい、メモリが不足します。しかし、このスーパーcsvの欠点はどうですか?

于 2012-10-01T00:54:32.777 に答える