Java Fork Join Pool Использование всех ресурсов потоков

1

У меня есть синтаксический анализатор строк (синтаксический анализ больших текстовых блоков), которые нужно запускать в пуле соединений java fork. Пул быстрее, чем другие потоки, и сократил время разбора более чем на 30 минут при использовании как регулярных выражений, так и xpath. Тем не менее, количество создаваемых потоков резко поднимается, и мне нужно уметь их прекратить, поскольку пул потоков вызывается несколько раз. Как я могу уменьшить увеличение потоков без ограничения пула до 1 ядра на 4-х ядровой системе?

Количество моих потоков превышает 40000, и мне нужно, чтобы он был ближе к 5000, так как программа работает 10 раз с пределом каменного холода 50000 потоков для моего пользователя.

Эта проблема происходит как в Windows, так и в Linux.

Я:

  • установка максимальных процессоров на количество доступных процессоров * настраиваемый номер, который в настоящее время равен 1
  • отмена задач после вызова get()
  • отчаянно устанавливая пул forkjoin равным нулю, прежде чем восстанавливать, потому что я в отчаянии

Любая помощь будет оценена по достоинству. Благодарю.

Вот код, который я использую, чтобы остановить, получить и перезапустить пул. Я должен, вероятно, также отметить, что я отправляю каждую задачу с помощью fjp.submit(TASK), а затем вызывая их всех при завершении работы.

while (pages.size()> 0) {log.info("Текущие активные темы:" +Thread.activeCount()); log.info("Страницы, найденные в итерации" + j + ":" +pages.size());

        if(fjp.isShutdown())
        {
            fjp=new ForkJoinPool(Runtime.getRuntime().availableProcessors()*procnum);
        }

        i=0;
        //if asked to generate a hash, due this first
        if(getHash==true){
            log.info("Generating Hash");
            int s=pages.size();
            while(i<s){
                String withhash=null;
                String str=pages.get(0);

                if(str != null){
                    jmap=Json.read(str).asJsonMap();
                    jmap.put("offenderhash",Json.read(genHash(jmap.get("offenderhash").asString()+i)));

                    for(String k:jmap.keySet()){
                        withhash=(withhash==null)?"{\""+k+"\":\""+jmap.get(k).asString()+"\"":withhash+",\""+k+"\":\""+jmap.get(k).asString()+"\"";
                    }

                    if(withhash != null){
                        withhash+=",}";
                    }

                    pages.remove(0);
                    pages.add((pages.size()-1), withhash);
                    i++;
                }
            }
            i=0;
        }

        if(singlepats != null)
        {

        log.info("Found Singlepats");
        for(String row:pages)
        {   

            String str=row;
            str=str.replaceAll("\t|\r|\r\n|\n","");
            jmap=Json.read(str).asJsonMap();

            if(singlepats.containsKey("table"))
            {
                if(fjp.isShutdown())
                {
                    fjp=new ForkJoinPool((Runtime.getRuntime().availableProcessors()*procnum));
                }

                fjp=new ForkJoinPool((Runtime.getRuntime().availableProcessors()*procnum));

                if(jmap.get(column)!=null)
                {

                    if(test){
                        System.out.println("//////////////////////HTML////////////////////////\n"+jmap.get(column).asString()+"\n///////////////////////////////END///////////////////////////\n\n");
                    }

                    if(mustcontain != null)
                    {
                        if(jmap.get(column).asString().contains(mustcontain))
                        {
                            if(cannotcontain != null)
                            {
                                if(jmap.get(column).asString().contains(cannotcontain)==false)
                                results.add(fjp.submit(new ParsePage(replacementPattern,singlepats.get("table"),jmap.get(column).asString().replaceAll("\\s\\s", " "),singlepats, Calendar.getInstance().getTime().toString(), jmap.get("offenderhash").asString())));
                            }
                            else
                            {
                                results.add(fjp.submit(new ParsePage(replacementPattern,singlepats.get("table"),jmap.get(column).asString().replaceAll("\\s\\s", " "),singlepats, Calendar.getInstance().getTime().toString(), jmap.get("offenderhash").asString())));
                            }
                        }
                    }
                    else if(cannotcontain != null)
                    {
                        if(jmap.get(column).asString().contains(cannotcontain)==false)
                        {
                            results.add(fjp.submit(new ParsePage(replacementPattern,singlepats.get("table"),jmap.get(column).asString().replaceAll("\\s\\s", " "),singlepats, Calendar.getInstance().getTime().toString(), jmap.get("offenderhash").asString())));
                        }
                    }
                    else
                    {
                        results.add(fjp.submit(new ParsePage(replacementPattern,singlepats.get("table"),jmap.get(column).asString().replaceAll("\\s\\s", " "),singlepats, Calendar.getInstance().getTime().toString(), jmap.get("offenderhash").asString())));
                    }
                }
            }

            i++;

            if(((i%commit_size)==0 & i != 0) | i==pages.size() |pages.size()==1 & singlepats != null)
            {
                log.info("Getting Regex Results");

                log.info("Shutdown");

                try {
                    fjp.awaitTermination(termtime, TimeUnit.MILLISECONDS);
                } catch (InterruptedException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }

                fjp.shutdown();
                while(fjp.isTerminated()==false)
                {
                    try{
                        Thread.sleep(5);
                    }catch(InterruptedException e)
                    {
                        e.printStackTrace();
                    }
                }


                for(Future<String> r:results)
                {
                    try {
                        add=r.get();
                        if(add.contains("No Data")==false)
                        {
                            parsedrows.add(add);
                        }

                        add=null;
                        if(r.isDone()==false)
                        {
                            r.cancel(true);
                        }

                        if(fjp.getActiveThreadCount()>0 && fjp.getRunningThreadCount()>0)
                        {
                            fjp.shutdownNow();
                        }

                        fjp=new ForkJoinPool(Runtime.getRuntime().availableProcessors()*procnum);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (ExecutionException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

                results=new ArrayList<ForkJoinTask<String>>();

                if(parsedrows.size()>=commit_size)
                {

                    if(parsedrows.size()>=SPLITSIZE)
                    {
                        sendToDb(parsedrows,true);
                    }
                    else
                    {
                        sendToDb(parsedrows,false);
                    }

                    parsedrows=new ArrayList<String>();
                }


                //hint to the gc in case it actually pays off (think if i were a gambling man)
                System.gc();
                Runtime.getRuntime().gc();
            }


        }
        }
        log.info("REMAINING ROWS TO COMMIT "+parsedrows.size());
        log.info("Rows Left"+parsedrows.size());
        if(parsedrows.size()>0)
        {


            if(parsedrows.size()>=SPLITSIZE)
            {
                sendToDb(parsedrows,true);
            }
            else
            {
                sendToDb(parsedrows,false);
            }


            parsedrows=new ArrayList<String>();
        }

        records+=i;
        i=0;

//Query for more records to parse
  • 0
    Можете ли вы опубликовать полный код или предоставить ссылки на pastebin? Второй вопрос - почему ForkJoinPool? Чтобы ответить на этот вопрос, вам необходимо выяснить, можно ли разбить некоторую строку на разбор ее подстрок и каким-то образом объединить результаты.
  • 0
    Я добавил свой код в корзину. Капли на самом деле не могут быть разделены дальше из-за их природы. Я разбираю их в поля практически из любого места на странице
Показать ещё 1 комментарий
Теги:
multithreading
fork-join
forkjoinpool

2 ответа

2
Лучший ответ

Похоже, вы делаете новый ForkJoinPool для каждого результата. То, что вы действительно хотите сделать, это сделать один ForkJoinPool, который все ваши задачи будут разделять. Дополнительные пулы не будут обеспечивать дополнительный параллелизм, поэтому все должно быть хорошо. Когда вы получаете задачу, которая готова к запуску, возьмите ваш fjp и вызовите fjp.execute(ForkJoinTask) или ForkJoinTask.fork() если вы уже в задаче.

Создание нескольких бассейнов похоже на бумажный кошмар. Постарайтесь уйти с одним, кто поделился.

  • 0
    К сожалению, это все еще не решило проблему. Я отредактировал мой код. Я должен заново создать свой пул, чтобы избежать проблемы с пространством кучи, но я восстановил его после того, как все будет завершено.
  • 0
    Это был самый правильный ответ. Я добавил callables и смог убрать выключение и сохранить скорость. Спасибо
-1

Вероятно, вы используете join() в Java7. Присоединиться не работает. Для этого требуется контекстный переключатель, и Java-программы не могут выполнять контекстный переключатель, поэтому среда создает "продолжения потоков" для продолжения движения. Я подробно описал эту проблему несколько лет назад в этой статье: ForkJoin Clamamity

  • 0
    Моя ошибка в этом посте. Код является всего лишь фрагментом и не компилируется, поэтому я пропустил смысл.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню