У меня есть каталог, который содержит 1000 файлов csv, которые мне нужно проанализировать. Я выполнил класс ExecutorService Java для выполнения задания, в котором я назначил каждому потоку файл csv для разбора. У меня 4 ядра в моей машине. Я получаю некоторую эффективность по сравнению с однопоточным приложением. Однако, когда я вижу использование ЦП (используя диспетчер задач), похоже, что он не использует всю мощность процессора,% используемого процессора составляет около 30% -40%. Я просто хотел узнать, правильный ли мой подход.Параллельная обработка файлов в Java с помощью ExecutorService не использует всю мощность ЦП
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)));
}
1. Как создать ExecutorService? 2. Насколько велики эти файлы? Это может быть очень хорошо связанная задача ввода/вывода, а не связанная с ЦП. 3. Не могли бы вы показать нам весь код (а не только эскиз)? –
Ваша задача, вероятно, связана с IO, и слишком много потоков могут фактически уменьшить IO, если он заставляет голову жесткого диска прыгать назад и вперед между файлами. –
Размер ребра около 500 МБ, и каждый файл должен быть около 2-3 МБ. Код, который я использую для создания ExecutorService, - int noProcs = Runtime.getRuntime(). AvailableProcessors(); ExecutorService eservice = Executors.newFixedThreadPool (noProcs); – dehsams123