1

У меня есть List<Map<String,String>> ie; Список карт. Каждая Карта имеет File Name как Key и File Content как Value.Письменные файлы с использованием Executor in Java

У меня есть более 25 карт Лаха в приведенном выше списке. Мое требование состоит в том, чтобы перебирать этот список и создавать файлы в выходной папке, считывая каждый ключ карты и значение. Поэтому в конце у меня будет 25 файлов lakh. Это занимает больше 4 часов. Затем я останавливаю программу. Я не знаю точное время, которое потребуется, если я запустил программу для целых 25-литровых записей.

Мне нужно оптимизировать это, используя Multithreading.

Как оптимизировать это с помощью Java Executors/ Fork/ Join (я имею Java 7)

ответ

4

Если вы пишете ваши файлы на одном диске я не думаю, что добавление дополнительных потоков действительно поможет. Ваша программа связана с IO, а не с интенсивностью процессора.

+0

Это возможно, но если для обработки 25 файлов требуется 4 часа, либо происходит много предварительной обработки (что может быть полезно для многопоточности), либо это огромные файлы. –

+0

Возможно. Но в описании проблемы ничего не сказано. Основываясь на том, что он описывает, его приложение просто перебирает список, создавая файл с ключом и выдавая значение в виде содержимого файла. – vptheron

+0

Это 25 лак (2,5 миллиона) файлов не 25 –

0

Вы можете использовать ThreadPoolExecutor и класс, который реализует Runnable.

public class Processor implements Runnable { 
    private final Map<String, String> map; 

    public Processor(Map<String, String> map) { 
     this.map = map; 
    } 

    public void run() { 
     // Do work here 
    } 
} 

ThreadPoolExecutor executor = new ThreadPoolExecutor(); 
for(Map<String, String> map : list) { 
    executor.execute(new Processor(map)); 
} 
0

Распараллеливание может быть достигнуто путем проблемы расщепления во множестве проблем, связанных с процессором. Для списка итератора, вы можете перебирать подсписки:

int nThreads = Runtime.getRuntime().availableProcessors() + 1; 
ExecutorService exec = Executors.newFixedThreadPool(nThreads); 
int interval = list.size()/parallel.nThreads; 
int from  = 0; 
for(int i = 0; i < nThreads; ++i) { 
    int to = (i == nThreads - 1) ? 1000 : from + interval; 
    exec.submit(new Search(from, to, list)); 
    from = to; 
} 
exec.shutdown(); 
exec.awaitTermination(1, TimeUnit.DAYS); 

Класс Search используются, чтобы сделать работу (создание файлов).

Пример Search класса:

class Search implements Runnable { 

    final int from; 
    final int to; 
    final List< Map< String, String >> list; 

    Search(int from, int to, List< Map< String, String >> list) { 
    this.from = from; 
    this.to = to; 
    this.list = list; 
    } 

    @Override 
    public void run(){ 
    for(int b = from; b < to; ++b) { 
     Map< String, String > map = list.get(b); 
     ... 
    } 
    } 
} 
0

Мало что отметить:

Как @vtheron сказал «программа больше IO связаны, а не ЦП», поэтому добавление большего количества нитей, вы будете тратить больше циклов процессора в контекстных переключателях, которые здесь вообще не требуются.

Я предполагаю, что ваш текущий контрольный показатель составляет 2,5 миллиона за 4 часа, Итак, какова текущая реализация?

Конфигурация оборудования также будет играть жизненно важную роль в улучшении производительности, подумайте над этим.

 Смежные вопросы

  • Нет связанных вопросов^_^