Как вы находите ограничивающий фактор программы? - PullRequest
1 голос
/ 03 июня 2011

Я создал программу, которая анализирует данные из файла и импортирует их в реляционную базу данных postgresql. Программа работает уже 2 недели и, похоже, у нее осталось еще несколько дней. Это в среднем ~ 150 импорт в секунду. Как мне найти ограничивающий фактор и заставить его работать быстрее? Процессор для моей программы не превышает 10%, память не превышает 7%. ЦП базы данных Postgresql не превышает 10% и 25% памяти.

Я предполагаю, что ограничивающим фактором является скорость записи на жесткий диск, но как я могу проверить, и если да, то; Улучши это? (если не считать более быстрый жесткий диск)

Это вывод "iostat -d -x":

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.59     3.23    0.61    1.55    23.15    38.37    28.50     0.01    5.76   1.04   0.22
sdb               0.02   308.37   21.72  214.53   706.41  4183.68    20.70     0.56    2.38   2.24  52.89

Как вы можете догадаться, база данных находится на SDB.

РЕДАКТИРОВАТЬ: файл, который я анализирую, ~ 7 ГБ. Для большинства (но не для всех) данных в файле я иду строка за строкой, вот пример "

  1. Возвращает идентификатор partA в таблице A.
    • Если идентификатор не существует, вставьте partA в таблицу, возвращая идентификатор
  2. Возвращает идентификатор partB в tableB.
    • Если ID не существует, вставьте partB в tableB, возвращая ID
  3. Возвращает идентификатор отношения «многие ко многим» для partA и partB.
    • Если идентификатор отношения не существует, создайте его.
    • иначе обновите связь (с идентификатором даты)
  4. перейти на следующую строку.

Чтобы сохранить много запросов, я сохраняю идентификаторы вставленных элементов PartA и PartB в памяти, чтобы уменьшить количество поисков.

Вот копия моего файла postgresql.conf: http://pastebin.com/y9Ld2EGz Единственное, что я изменил: каталог данных по умолчанию и ограничения памяти.

1 Ответ

2 голосов
/ 03 июня 2011

Вы должны были убить этот процесс много-много дней назад и спросить не how to find the limiting factor of the app, а скорее:

Есть ли более быстрый способ импорта данных в pgSQL?

Взгляните на этот вопрос и затем документацию pgSQL COPY . Вполне возможно, что процесс импорта, который вы выполняете, может быть достигнут за часы, а не недели с помощью соответствующих инструментов.

Кстати, независимо от того, какую СУБД вы используете, программные вставки данных никогда не будут такими эффективными, как встроенные инструменты, предоставляемые поставщиком СУБД для обработки массовых операций, подобных этим. Например: SQL Server имеет bcp, DTS / SSIS и несколько других опций для массового импорта / экспорта данных. Oracle имеет свой собственный и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...