Слишком мало загрузки процессора в Java - PullRequest
6 голосов
/ 12 января 2009

Привет, сообщество stackoverflow!

У меня проблема, когда высокоразвитая алгоритмическая программа использует слишком маленькую загрузку процессора: где-то между 3 и 4%. Возвращение результатов занимает очень много времени, и я считаю, что оно работает недостаточно усердно.

Есть ли у кого-нибудь из вас гениев какие-либо идеи, почему это произойдет - во всяком случае, я бы ожидал 100% использования. Еще одна деталь заключается в том, что программа делает вставки в базу данных sqlite3, и, таким образом, да, существует много вызовов JNI через библиотеку sqlite3jdbc, я считаю. (Обратите внимание, что я хотел отложить эти вставки с помощью пакета PreparedQuery ранее, но это вызвало серьезные проблемы с памятью - там много данных).

Заранее спасибо

ОБНОВЛЕНИЕ: Исправлено. Да, я был просто глупцом, но я не ожидал, что sqlite запустит новую транзакцию и сделает так много накладных расходов.

Теперь я использую PreparedStatement и ставлю в очередь 32768 записей перед вставкой - мне это показалось достаточно хорошим.

Ответы [ 4 ]

4 голосов
/ 12 января 2009

Я бы никогда не рекомендовал использовать драйвер JDBC с JNI, если доступна версия Java со 100% типом IV Google нашел этот один.

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

Что такого "интенсивного" в INSERTs?

Я бы рекомендовал профилировать и получать реальные данные, а не гадать. Основанные на вере вычисления никогда не работают для меня.

1 голос
/ 12 января 2009

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

1 голос
/ 12 января 2009

Очевидно, что вызовы базы данных вызывают задержки. Разве это не возможность создавать меньшие партии и проверять, помогает ли это? Может быть, вы могли бы также распараллелить алгоритм, чтобы очередь где-нибудь получала результаты, а другой поток очищал эту очередь?

редактирование:

Есть и другие проблемные области:

  • Оптимизация базы данных (модель)
  • Конфигурация сервера базы данных
  • Скорость диска

Все эти факторы должны быть приняты во внимание

0 голосов
/ 12 января 2009

Диск замедляет работу вашего приложения. INSERTS используют диск, диск работает медленно, и ОС нужно дождаться завершения операций записи.

Разве вы не можете использовать 2 потока, один для алгоритма, а другой для вставок? Если вы делаете только вставки, вы также можете записать их в текстовый файл и выполнить их позже

...