Вниз
Скачать: CL | DM;

Перекачка большого кол-ва записей в Ibase. Проблема нехватки   Найти похожие ветки 

 
dimm22   (2004-03-22 18:01) [0]

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


 
Johnmen ©   (2004-03-22 18:05) [1]

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


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

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


 
Vlad ©   (2004-03-22 18:12) [3]


> dimm22   (22.03.04 18:09) [2]

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


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

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

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

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


 
Vlad ©   (2004-03-22 18:24) [5]


> dimm22   (22.03.04 18:17) [4]


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

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


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

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

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


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

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

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


 
Domkrat ©   (2004-03-22 18:34) [8]

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


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

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


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


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

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


 
Romkin ©   (2004-03-22 20:22) [11]

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


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

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

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



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.022 c
3-1080104496
Максим
2004-03-24 08:01
2004.04.18
Вычленение данных из строки


1-1080900303
СержК
2004-04-02 14:05
2004.04.18
Запуск внешнего bat файла


14-1080531075
mfender
2004-03-29 07:31
2004.04.18
Ну, сегодня они превзошли самих себя! :-D


14-1079877087
panov
2004-03-21 16:51
2004.04.18
Срочно нужна помощь!


3-1080101505
Oldster
2004-03-24 07:11
2004.04.18
События в базе данных




   Наверх