거대한 csv 파일을 읽고 싶습니다. superCSV를 사용하여 일반적으로 파일을 구문 분석합니다. 이 특정 시나리오에서 파일은 거대하며 명백한 이유로 메모리 부족 문제가 항상 있습니다.superCSV를 사용하여 80GB의 큰 텍스트 파일을 읽으십시오.
초기 아이디어는 파일을 청크로 읽는 것이지만 파일을 청크 할 때 첫 번째 청크 만 헤더 값을 갖고 CSV 빈에로드되기 때문에 이것이 superCSV와 작동하는지 잘 모릅니다. 다른 청크에는 헤더 값이 없으므로 예외가 발생할 수 있다고 생각합니다. 그래서
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 {
}
}
}
첫 번째 청크에 헤더 값 행을 만듭니다. 그런 다음 첫 번째 청크를 다른 많은 청크와 연결하여 한 번에 하나의 청크를 처리하여 충분히 큰 파일을 작게 만드십시오. –
나는 무엇이 이것을 일으키는 지 궁금하다. 일단 읽은 콩으로 무엇을하고 있니? 목록에 추가하는 경우 메모리 부족 현상이 발생할 가능성이 큽니다. 독자가 읽을 때마다 각 bean을 처리하도록 응용 프로그램 구조를 변경하거나 작은 그룹으로 처리 할 수 있습니까? –