我有一个目录,其中包含我需要解析的 1000 个 csv 文件。我已经实现了 Java 的 ExecutorService 类来完成这项工作,其中我为每个线程分配了一个 csv 文件来解析。我的机器上有 4 个内核。与单线程应用程序相比,我确实获得了一些效率。但是,当我看到 CPU 利用率(使用任务管理器)时,它似乎并没有利用所有的 CPU 能力,使用的 CPU 百分比仅为 30%-40% 左右。我只是想知道我的方法是否正确。
File dir = new File(file);
if(dir.isDirectory()){
File[] files = dir.listFiles();
for(File f : files){
String file_abs_path = f.getAbsolutePath();
int index = file_abs_path.lastIndexOf("/") + 1;
file_name = file_abs_path.substring(index);
futuresList.add(eservice.submit(new MyParser(file_abs_path)));
}
Object gpDocs;
for(Future<List<MyObj>> future:futuresList) {
try {
docs = future.get();
arrayList = (List<MyObj>)docs;
Iterator<MyObj> it = arrayList.iterator();
while(it.hasNext()){
doc = createDocument(file_name,it.next());
try{
//somefunction(doc);
}catch(Exception e){}
}}catch (InterruptedException e) {}
catch (ExecutionException e) {}
}}
我只是想知道我的方法是否正确?任何帮助,将不胜感激。
谢谢
解析器的代码是:
public List<MyObj> call(){
ColumnPositionMappingStrategy<MyObj> strat =
new ColumnPositionMappingStrategy<MyObj>();
strat.setType(MyObj.class);
String[] columns = new String[] {//list of columns in the csv file};
strat.setColumnMapping(columns);
CsvToBean<MyObj> csv = new CsvToBean<MyObj>();
BufferedReader reader = null;
String doc_line = "";
String[] docs;
String doc = "";
File dir = new File(file_path);
try{
int comma_count = 0;
reader = new BufferedReader(new FileReader(dir));
while((doc_line = reader.readLine()) != null){
docs = doc_line.split(",");
doc += docs[i] + " ";
}
reader.close();
}catch (IOException e) {/*e.printStackTrace();*/}
return(csv.parse(strat,new StringReader(doc)));
}