Страница 1 из 1
Массированный перегон из txt в SQL
Добавлено: 01 авг 2005, 13:46
Aku
Есть много больших txt с разделителями...надо их все перегнать в SQL, 1-2 раза в день...2000000-3000000 записей...
IB6.5 Delphi 7. Написал прогу - скорость 350-400 строк в сек, одна строка - 200-230 символов. Тачка Cel2,26 512 Mb, и клиент и сервер на ней...
Часть 1. Интересны наиболее производительные варианты обработки.
Часть 2. При попытке реализации структуры:
form1.IBSQL1.SQL.Text:='insert into logs (id,...,...,...,...,...,...,...,...) values (:id,...,...,...,...,...,...,...,...)';
try
IBSQL1.Prepare;
IBSQL1.ExecQuery;
except
form1.IBTransaction1.Rollback;
end;
не может присвайвать id увеличившееся значение генератора, а значение генератора при этом нормально увеличивается...?
Добавлено: 01 авг 2005, 14:06
kdv
скорость нормальная, и возможно предельная, если записи вставляешь пакетами в транзакции (а не по записи на транзакцию).
попробуй еще batch-компоненты (
www.ibase.ru/devinfo/ibx.htm), может будет быстрее (хотя по идее быстрее всего external tables, если текстовые файлики можно закидывать на сервер).
насчет
не может присвайвать id увеличившееся значение генератора, а значение генератора при этом нормально увеличивается...?
ничего не понятно. может, имеет смысл глянуть
www.ibase.ru/devinfo/generator.htm ?
может как раз и с генератором...
Добавлено: 01 авг 2005, 15:24
Aku
Выявил след:
SET GENERATOR gen_logs_id TO 34;
запрос обрабатывается нормально
а вот этот всегда возвращает null
SELECT GEN_ID(gen_logs_id, 0) FROM logs;
В чем причина? Возможна ли связь с диалектом, версией или чем-то другим?
Добавлено: 01 авг 2005, 17:17
kdv
не могет такого быть. либо ты "удалил" и пересоздал этот генератор, удаляя его путем delete from rdb$generators...
Добавлено: 01 авг 2005, 17:24
Aku
...догнал...надо было прописывать rdb$database вмето logs... хотя вроде не очень то и логично....ну да ладно....
Запустил я вообщем этот бред, все отработало. около 500 в сек в среднем...надо будет на серваках тестнуть....один как клиент - другой сервер. оба 2xXeon 3.2 по 8 гб DDR...интересно чем закончится...

гы
новые глюки...
Добавлено: 02 авг 2005, 12:11
Aku
Запускаю приложение. перегоняю 500000 записей из txt в sql. Сервак фиксирует в процессе 1 подключение к 1 базе...клиент отрабатывает, закрывается. Сервак соответственно обновляется до 0.0...
Дак вот если запустить еще раз этого клиента с любым файлом(даже только что проведенным), то по началу все ок, затем у сервака начинает лаинообразно увеличиваться кол-во подключений...из 1.1 от фиксирует 20.1...50.1...121.1...и т.д. клиент проводит последнюю запись из txt и намертво виснет....процесс увеличения подключений еще более ускоряется....в чем может быть беда???
Варианты с транзакциями пробовал от и до. Т.е. на 1 запись одна транзакция, вплоть до 1 транзакции на 5000 записей...откатов при этом нет...
P.S. перезагрузка клиента не спасает, перезагрузка сервака спасает. Если на серваке убить IB как процесс, или перезапустить сервак не помогает...
Добавлено: 02 авг 2005, 13:14
kdv
копай в своей программе. серверу "подключения" не нужны, он их сам увеличивать никак не может.
Т.е. на 1 запись одна транзакция, вплоть до 1 транзакции на 5000 записей...откатов при этом нет...
а разве должны быть? наоборот - при массовых заливках оформляют именно пакетами. иначе будет тормозить.
ошибка логики
Добавлено: 03 авг 2005, 10:16
Aku
мда...ты был прав...при определенных условия возникало безвариантное логическое условие, создававшее множественные подключения в разных потоках, поэтому и отловить немог. Перестроив логику проблему решил.