Я создал программу, которая анализирует данные из файла и импортирует их в реляционную базу данных 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 ГБ.
Для большинства (но не для всех) данных в файле я иду строка за строкой, вот пример "
- Возвращает идентификатор partA в таблице A.
- Если идентификатор не существует, вставьте partA в таблицу, возвращая идентификатор
- Возвращает идентификатор partB в tableB.
- Если ID не существует, вставьте partB в tableB, возвращая ID
- Возвращает идентификатор отношения «многие ко многим» для partA и partB.
- Если идентификатор отношения не существует, создайте его.
- иначе обновите связь (с идентификатором даты)
- перейти на следующую строку.
Чтобы сохранить много запросов, я сохраняю идентификаторы вставленных элементов PartA и PartB в памяти, чтобы уменьшить количество поисков.
Вот копия моего файла postgresql.conf: http://pastebin.com/y9Ld2EGz Единственное, что я изменил: каталог данных по умолчанию и ограничения памяти.