Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перекачка большого кол-ва записей в Ibase. Проблема нехватки [D7, IB6.x]


dimm22 ©   (2004-03-22 18:01:00) 

памяти. Нужно ночью из одной файл серверной БД, к ней подключаюсь через БДЕ, перекачивать в данные в IB. Таблиц много, около 60, в некоторых по 70-80 полей. Колличество записей в самой большой таблице 500 000. Так вот, подключаюсь я к этой БД и соответственно к Ibase, в приложении пишу  pFibDataSEtKlient.FieldByName('name').AsString:= QueryKlient.FieldByName('name').AsString;
Итд по колличеству полей пока  While not QueryKlient.Eof.
Транзакцию подтверждаю каждые 1000 вставленных записей.
В некоторых таблицах по 4-7 мемо полей (вот на таких то таблицах и имею геморой). В итоге оперативная память быстро заканчивается. Какие варианты решения могут быть?  Всё это безобразие нужно делать автоматически каждую ночь.


dimm22   (2004-03-23 10:29:00) [1]

>Zacho
>Чушь. Тоже самое было бы и любым другим сервером

Я думаю Domkrat имел в виду что виноват DataSet который к Ibase цепляется, а не сам сервер. Сам то сервер делал вставку абсолютно без напрягов, не занимая много ресурсов памяти (2-5 Mb ) и процессора(1-3 %). На самом деле так оно и есть, ибо переход на Query с параметрами дал нужный результат. В общем  осталось для интереса попробовать гетерогенный запрос. Ну и может предложение Romkin. Хотя сейчас и так всё прекрасно работает. За что всем огромный РЕСПЕКТ.


Romkin   (2004-03-22 20:22:00) [2]

Можно просто создать текстовый файл, в котором insert into... и commit work через каждые 1000-10000 записей, в IB идет элементарно :) а так - через insert  самое то. Кстати, если в текстовом файле в начале написать CONNECT ... то писать вообще не придется - просто подать его isql, само все сделает


Zacho   (2004-03-22 20:10:00) [3]


> Domkrat ©   (22.03.04 18:29) [7]
> Переполнение памяти скорее из-за IB

Чушь. Тоже самое было бы и любым другим сервером. Переполнение памяти только из-за того, что создается кэш набора данных на клиенте. Правильное решение - использовать нужные компоненты (и/или правильно использовать компоненты) . С FIBPlus не работаю, а для IBX или BDE сказал бы что делать.


dimm22   (2004-03-22 18:37:00) [4]

Спасибо за объяснение. Щас уже ваяю гетерогенный запрос. Потом попробую Insert Into. А результатах завтра сообщу.


Domkrat   (2004-03-22 18:34:00) [5]

И не используй
>pFibDataSEtKlient.FieldByName('name').AsString:=   QueryKlient.FieldByName('name').AsString;
>INSERT INTO ... с параметрами желательно


Johnmen   (2004-03-22 18:29:00) [6]

>ибо такое кол-во данных в неё тащится.

Вот и смысл в том, чтобы в каждый момент времени не редактировать полученный набор данных ! А использовать его только для чтения. Вставлять же INSERT INTO ... с параметрами желательно. Да и коммититься через 300-500 вставок.


Domkrat   (2004-03-22 18:29:00) [7]

Переполнение памяти скорее из-за IB.
Ты же там сам ничего не создаешь в цикле.

Думаю слишком много Commit-ов. Попробуй 1-табала -1 коомит.


Vlad   (2004-03-22 18:24:00) [8]


> dimm22   (22.03.04 18:17) [4]


> Мешает отсутствие знаний,

Ну, вкратце примерно так. В БДЕ создаешь два алиаса. Один алиас настраиваешь на базу IB, другой алиас -  на другой сервер с которого качать будешь. А гетерогенный запрос - это SQL запрос с участием этих двух алиасов, т.е. например так:
insert into :alias1.table1 select * from :alias2.Table2
Примерно так, точнее читай в справке по БДЕ.


dimm22   (2004-03-22 18:17:00) [9]

>А что мешает создать два алиаса в БДЕ и делать вставку данных с пом. гетерогенного запроса ? Не уверен, но мне кажется памяти будет кушаться гораздо меньше.

Мешает отсутствие знаний, но это уже мои проблемы, почитаю.

А утечка памяти происходит, в моём приложении. Ну это и понятно, ибо такое кол-во данных в неё тащится.


Vlad   (2004-03-22 18:12:00) [10]


> dimm22   (22.03.04 18:09) [2]

НД - набор данных. DataSet другими словами.
А что мешает создать два алиаса в БДЕ и делать вставку данных с пом. гетерогенного запроса ? Не уверен, но мне кажется памяти будет кушаться гораздо меньше.


dimm22   (2004-03-22 18:09:00) [11]

Что имеется ввиду под "НД". Чего то я не понял ответа :-)


Johnmen   (2004-03-22 18:05:00) [12]

Чтобы вставить новые записи вовсе не обязательно получать НД на таблицу, в которую вставка. Даже вредно, ибо расход памяти... :)


Наверх

Титульная страница Поиск, карта сайта Написать письмо