我有一个超过 700K + 行的巨大 CSV 文件。我必须解析该 CSV 文件的行并执行操作。我想通过使用线程来做到这一点。我一开始尝试做的很简单。每个线程都应处理 CSV 文件的唯一行。我的行数有限,只能读取 3000 行。我创建了三个线程。每个线程都应该读取 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 类简单查找传递的文件是否存在,然后创建一个 BufferedReader 并提供它。这个阅读器被传递给CSVOps 类。它有一个方法 readCSV,它读取 CSV 文件的单行并打印出来。限制设置为 3000。
现在为了让线程不搞乱计数,我将这些限制和计数变量都声明为静态的。当我运行这个程序时,我得到了奇怪的输出。我只得到大约 1000 条记录,有时我得到 1500 条。它们是随机排列的。在输出结束时,我得到两行 CSV 文件,当前线程名称是 main !!
我是线程的新手。我希望阅读这个 CSV 文件变得更快。可以做什么?