Страница 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
мда...ты был прав...при определенных условия возникало безвариантное логическое условие, создававшее множественные подключения в разных потоках, поэтому и отловить немог. Перестроив логику проблему решил.