2013-05-04 2 views
-4

У меня есть демо-счет, который должен обрабатывать сотни тысяч данных очень быстро. Я применил ExecutorSerivce для параллельной обработки. Это увеличило скорость, но не очень. Для обработки 1 000 000 записей требуется около 2,5-3 часов. Как я могу сделать это быстрее, чем обрабатывать эти данные за полчаса?Как сделать приложение Java быстрее?

Я написал следующее для настройки выполнения:

-Xms2048M -Xmx2048M -XX:MaxPermSize=256m 

Я пытался реализовать потребителей модель Producer с 1 производителем и 4 потребителей. Каждый список может содержать 10 000 записей.

ArrayBlockingQueue<BillableList> list =new ArrayBlockingQueue<BillableList>(10); 

ExecutorService threadPool = Executors.newFixedThreadPool(5); 
threadPool.execute(new Consumer("pool1", list)); 
threadPool.execute(new Consumer("pool2", list)); 
threadPool.execute(new Consumer("pool3", list)); 
threadPool.execute(new Consumer("pool4", list)); 
Future producerStatus = threadPool.submit(new Producer("Producer", list)); 
producerStatus.get(); 
threadPool.shutdown(); 

Кроме того, при обновлении записей в базе данных я получаю много исключений с превышением времени ожидания блокировки базы данных. Это связано с тем, что разные потребители пытаются использовать одного и того же пользователя одновременно? Как я могу заставить разных потребителей брать разные данные из списка ArrayBlockingQueue?

+1

Шаг 1: узнайте, почему это медленно. Время выполнения журнала операций высокого уровня, использование профилировщика, ведение журнала GC, чтобы узнать, если вы перепутаете память ... – millimoose

+0

Получите очень быстрый массив SSD для БД. –

+1

также ~ purrrrformance ~~~~ –

ответ

10

Единственный возможный ответ на этот вопрос: «Использовать профилировщик и выяснить, почему он медленный». Вы не можете ничего сделать по поводу проблемы, когда не знаете, где проблема. Что вы собираетесь делать, выбрать случайную функцию и микро-оптимизировать ее? Данные профилирования или ничего никогда не произойдут.

+0

Единственный возможный ответ? В самом деле? – Gray

+4

@Gray: Ваш ответ в основном - спекуляция. Тот факт, что размышление - это все, что вы могли сделать, показывает правильность того, что я сказал. – Puppy

+0

Спекуляция заключается в том, что «запуск профилировщика» - это простой ответ, особенно если ОП говорит о споре о дБ. – Gray

1

Как я могу сделать это быстрее, чем обрабатывать эти данные за полчаса?

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

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

И есть ваша большая подсказка. Независимо от того, сколько потоков работает над заданием, если они все ожидают базы данных, добавление потоков не ускоряет работу.

Вот некоторые идеи:

  • Увеличьте физическую скорость вашего ящика базы данных. SSD могут обеспечить чудесные улучшения для интенсивных операций ввода-вывода. Увеличение памяти также может дать большую победу из-за дискового кэша.
  • Рассмотрите возможность переноса данных и записи в несколько экземпляров базы данных. Это может быть невозможно с учетом вашей схемы.
  • Рассмотрите возможность отключения автоматической фиксации и ручной фиксации после каждых ~ 100 операций.
  • Следите за индексами. Если вы делаете какую-то массовую загрузку, часто, если вы отключите индексы, ваши вставки будут работать быстрее. Добавление индексов в конце занимает некоторое время, но все же выигрыш.
  • Кроме того, если вы выполняете запросы, убедитесь, что у вас есть хорошие индексы, где это необходимо. Проверьте журналы базы данных, чтобы узнать, какие запросы слишком длинные, чтобы увидеть, не хватает ли некоторых индексов в ключевых местах.
+0

Это действительно хороший ответ –

+0

@Gray .. Система находится на Amazon EC2, а база данных mysql находится на RDS. Запрос занимает 10 секунд, чтобы получить 10 000 записей! Я попробую профайлер и посмотрю, что происходит внутри! Благодаря.. !! –

+1

Профилировщик - хорошая идея, но я не уверен, что это поможет. Вы увидите, что он проводит время в JDBC, что означает ожидание соединения db. Удачи @MadanMadan. – Gray

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