Массированный перегон из txt в SQL

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
Aku
Сообщения: 5
Зарегистрирован: 01 авг 2005, 13:37

Массированный перегон из txt в SQL

Сообщение Aku » 01 авг 2005, 13:46

Есть много больших 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 увеличившееся значение генератора, а значение генератора при этом нормально увеличивается...?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 01 авг 2005, 14:06

скорость нормальная, и возможно предельная, если записи вставляешь пакетами в транзакции (а не по записи на транзакцию).

попробуй еще batch-компоненты (www.ibase.ru/devinfo/ibx.htm), может будет быстрее (хотя по идее быстрее всего external tables, если текстовые файлики можно закидывать на сервер).

насчет
не может присвайвать id увеличившееся значение генератора, а значение генератора при этом нормально увеличивается...?
ничего не понятно. может, имеет смысл глянуть
www.ibase.ru/devinfo/generator.htm ?

Aku
Сообщения: 5
Зарегистрирован: 01 авг 2005, 13:37

может как раз и с генератором...

Сообщение Aku » 01 авг 2005, 15:24

Выявил след:
SET GENERATOR gen_logs_id TO 34;
запрос обрабатывается нормально

а вот этот всегда возвращает null
SELECT GEN_ID(gen_logs_id, 0) FROM logs;

В чем причина? Возможна ли связь с диалектом, версией или чем-то другим?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 01 авг 2005, 17:17

не могет такого быть. либо ты "удалил" и пересоздал этот генератор, удаляя его путем delete from rdb$generators...

Aku
Сообщения: 5
Зарегистрирован: 01 авг 2005, 13:37

Сообщение Aku » 01 авг 2005, 17:24

...догнал...надо было прописывать rdb$database вмето logs... хотя вроде не очень то и логично....ну да ладно....
Запустил я вообщем этот бред, все отработало. около 500 в сек в среднем...надо будет на серваках тестнуть....один как клиент - другой сервер. оба 2xXeon 3.2 по 8 гб DDR...интересно чем закончится... :) гы

Aku
Сообщения: 5
Зарегистрирован: 01 авг 2005, 13:37

новые глюки...

Сообщение Aku » 02 авг 2005, 12:11

Запускаю приложение. перегоняю 500000 записей из txt в sql. Сервак фиксирует в процессе 1 подключение к 1 базе...клиент отрабатывает, закрывается. Сервак соответственно обновляется до 0.0...
Дак вот если запустить еще раз этого клиента с любым файлом(даже только что проведенным), то по началу все ок, затем у сервака начинает лаинообразно увеличиваться кол-во подключений...из 1.1 от фиксирует 20.1...50.1...121.1...и т.д. клиент проводит последнюю запись из txt и намертво виснет....процесс увеличения подключений еще более ускоряется....в чем может быть беда???
Варианты с транзакциями пробовал от и до. Т.е. на 1 запись одна транзакция, вплоть до 1 транзакции на 5000 записей...откатов при этом нет...
P.S. перезагрузка клиента не спасает, перезагрузка сервака спасает. Если на серваке убить IB как процесс, или перезапустить сервак не помогает...

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 02 авг 2005, 13:14

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

Aku
Сообщения: 5
Зарегистрирован: 01 авг 2005, 13:37

ошибка логики

Сообщение Aku » 03 авг 2005, 10:16

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

Ответить