700K + 行を超える巨大な CSV ファイルがあります。その CSV ファイルの行を解析して操作を行う必要があります。スレッドを使用してそれを行うことを考えました。私が最初にやろうとしていることは単純です。すべてのスレッドは、CSV ファイルの固有の行を処理する必要があります。読み取る行数が 3000 に制限されています。スレッドを 3 つ作成します。各スレッドは、CSV ファイルの 1 行を読み取る必要があります。コードは次のとおりです。
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 は、渡されたファイルが存在するかどうかを単純に検出し、BufferedReader を作成して提供します。このリーダーは CSVOps クラスに渡されます。CSV ファイルの 1 行を読み取って出力する readCSV メソッドがあります。3000 に制限が設定されています。
スレッドがカウントを台無しにしないようにするために、これらの制限とカウント変数の両方を静的として宣言します。このプログラムを実行すると、奇妙な出力が得られます。私は約 1000 レコードしか取得できず、1500 レコードを取得することもあります。順不同です。出力の最後に CSV ファイルの 2 行を取得し、現在のスレッド名が main であることがわかります!!
私はスレッドの初心者です。このCSVファイルの読み込みを速くしたい。それは何ができますか?