나는 700K 이상의 라인을 가진 거대한 CSV를 가지고있다. 나는 그 CSV 라인을 파싱하고 작전을 수행해야한다. 나는 스레딩을 사용하여 그것을 생각했다. 내가 처음에 시도하는 것은 간단합니다. 모든 스레드는 csv의 고유 한 행을 가져야합니다. 3000 행으로 제한된 수의 행을 읽었습니다. 3 개의 스레드를 만듭니다. 각 스레드는 csv 행을 읽어야합니다. 전달 된 파일이 다음의 BufferedReader를 생성하고 제공하는 경우거대한 CSV 라인을 읽는 자바 쉐이딩 프로그램
import java.io.*;
class CSVOps implements Runnable
{
static int lineCount = 1;
static int limit = 3000;
BufferedReader CSVBufferedReader;
public CSVOps(){} // default constructor
public CSVOps(BufferedReader br){
this.CSVBufferedReader = br;
}
private synchronized void readCSV(){
System.out.println("Current thread "+Thread.currentThread().getName());
String line;
try {
while((line = CSVBufferedReader.readLine()) != null){
System.out.println(line);
lineCount ++;
if(lineCount >= limit){
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
readCSV();
}
}
class CSVResourceHandler
{
String CSVPath;
public CSVResourceHandler(){ }// default constructor
public CSVResourceHandler(String path){
File f = new File(path);
if(f.exists()){
CSVPath = path;
}else{
System.out.println("Wrong file path! You gave: "+path);
}
}
public BufferedReader getCSVFileHandler(){
BufferedReader br = null;
try{
FileReader is = new FileReader(CSVPath);
br = new BufferedReader(is);
}catch(Exception e){
}
return br;
}
}
public class invalidRefererCheck
{
public static void main(String [] args) throws InterruptedException
{
String pathToCSV = "/home/shantanu/DEV_DOCS/Contextual_Work/invalid_domain_kw_site_wise_click_rev2.csv";
CSVResourceHandler csvResHandler = new CSVResourceHandler(pathToCSV);
CSVOps ops = new CSVOps(csvResHandler.getCSVFileHandler());
Thread t1 = new Thread(ops);
t1.setName("T1");
Thread t2 = new Thread(ops);
t1.setName("T2");
Thread t3 = new Thread(ops);
t1.setName("T3");
t1.start();
t2.start();
t3.start();
}
}
클래스 CSVResourceHandler 간단한 발견 : 다음은 코드입니다. 이 리더는 CSVOps 클래스로 전달됩니다. 그것에는 csv의 한 줄을 읽고 그것을 인쇄하는 readCSV 메쏘드가 있습니다. 한도는 3000으로 설정되어 있습니다.
이제 스레드가 카운트를 잘못 계산하는 경우, 그 한계 및 카운트 변수를 모두 정적으로 선언합니다. 이 프로그램을 실행하면 이상한 결과를 얻습니다. 나는 약 1000 개의 레코드 만 얻는다. 나는 1500을 얻는다. 그들은 무작위 순서로있다. 출력이 끝나면 2 줄의 csv가 나오고 현재 쓰레드 이름이 나온다.
나는 스레드에서 매우 초보자입니다. 내가 원한 것은이 CSV를 읽는 것이 빨리되어야한다는 것입니다. 수행 할 수있는 것을 제안하십시오.
하나 이상의 읽기 스레드를 사용하면 도움이되지 않습니다. 차단 지점은 CPU가 아니라 IO입니다. –
하나의 스레드로 작업하고 두 번째 스레드에서 사용할 수있는 대기열로 읽으면 각 줄을 전달할 것을 제안합니다. 이렇게하면 주문이 보존됩니다. –
@PeterLawrey : 멋진 아이디어! – Shades88