Слишком мало использования процессора в Java
-
10-07-2019 - |
Вопрос
Привет, сообщество stackoverflow!
У меня возникла проблема: сложная алгоритмическая программа использует СЛИШКОМ МАЛЕНЬКУЮ загрузку процессора:где-то между 3 и 4%.Чтобы получить результаты, требуется очень много времени, и я считаю, что это просто недостаточно усердно.
Есть ли у кого-нибудь из вас, гениев, идеи, почему это могло произойти? Во всяком случае, я бы ожидал 100% использования.Еще одна деталь заключается в том, что программа делает вставки в базу данных sqlite3, и поэтому да, я полагаю, что через библиотеку sqlite3jdbc происходит много вызовов JNI.(Обратите внимание, что ранее я хотел отложить эти вставки с помощью пакета ReadedQuery, но это вызвало серьезные проблемы с памятью — данных много).
заранее спасибо
ОБНОВЛЯТЬ:Зафиксированный.Да, я просто придурок, но я не ожидал, что sqlite начнет новую транзакцию и создаст столько накладных расходов.
Теперь я использую ReadedStatement и ставлю в очередь 32768 записей перед вставкой - мне показалось, что это достаточно хорошее число.
Решение
Очевидно, что вызовы базы данных вызывают задержки.Разве это не возможность создавать небольшие партии и проверять, поможет ли это??Может быть, вы могли бы также распараллелить алгоритм, чтобы где-то была очередь, принимающая результаты, и другой поток, очищающий эту очередь?
редактировать:
Есть и другие проблемные места:
- Оптимизация базы данных (модель)
- Конфигурация сервера базы данных
- Скорость диска
Все эти факторы следует учитывать
Другие советы
Я бы никогда не рекомендовал использовать драйвер JDBC с JNI, если доступна версия Java со 100% типом IV. Google нашел этот один.
Помимо этого, я не могу ничего сказать без дополнительной информации. Приложение и база данных работают на одном и том же оборудовании?
Что такое "интенсивный" о вставках?
Я бы рекомендовал профилировать и получать реальные данные, а не гадать. Основанные на вере вычисления никогда не работают для меня.
Если вы пишете много данных, похоже, вы привязаны к диску. Посмотрите на статистику дискового IO на компьютере, и если это действительно узкое место, либо найдите оборудование с лучшим IO, либо выясните, как выполнять меньше операций записи.
Диск замедляет работу вашего приложения. INSERTS используют диск, диск работает медленно, и ОС нужно дождаться завершения операций записи. Р>
Разве вы не можете использовать 2 потока, один для алгоритма, а другой для вставок? Если вы делаете только вставки, вы также можете записать их в текстовый файл и выполнить их позже