Перегон БД из MsSQLserver в Firebird - ошибка Out of memory.

markyzz

При больших объемах почему-то ругается на Out of Memory.

markyzz

ADOTable3->Open;
IBTable3->Open;
while (!ADOTable3->Eof)
{
IBTable3->Append;
IBTable3->FieldByName("stockid")->AsString = ADOTable3->FieldByName("stockid")->AsString;
IBTable3->Post;
ADOTable3->Next;
}
ADOTable3->Close;
IBTable3->Close;
код такой...
никто не подскажет, в чем проблема?
спасиб заранее

pitrik2

размер таблицы какой? select count(*) from table
попробуй явный коммит добавить после каждых N инсертов
например N = 100 или 1000
типа того:

while (!ADOTable3->Eof)
{
IBTable3->Append;
IBTable3->FieldByName("stockid")->AsString = ADOTable3->FieldByName("stockid")->AsString;
IBTable3->Post;

count++;

if count mod N = 0
IBTable3->Commit;


ADOTable3->Next;
}

сорри, но я даж не знаю на каком языке это написано :)

markyzz

сорри, но я даж не знаю на каком языке это написано
блин... сорри - сорри. моя вина:
BuilderC++, использую компоненты панелей ADO (для коннекта к серверу) и InterBase (для коннекта к Embedded FireBird)
IBTable3->Commit; - такого нет... :(

0000

[я нуб если чо]
Че та мне кажется, что твой подход совсем плохой.
Если операция будет проводится один раз, то лучше воспользоваться тулзой для перекачки данных.
Если это необходимо закодить, то имхо лучше генерить батчки из SQL-запросов на insert и вставлять их в БД (хотя неплохо бы на код IBTable3->Post; взглянуть - что там внутри творится).
Еще наверно стоит локализовать проблемы - кто дает out of memory - ADO или IB. (в первом случае надо закоментить вставку в IB, во втором уменьшить объем выборки).

pitrik2

закоментить
имелось ввиду закоммитить? :)

pitrik2

IBTable3->Commit; - такого нет...
ну а там нельзя посмотреть список того что есть?
может она как-то по-другому называется, типа IBTable3->CommitWork
может это на уровне выше, т.е. у IBTable3 есть "родитель", верней объект который его создал
и у него есть Commit
открой доку по этому делу

0000

Нет, именно закомментить, т.е. убрать код, который работает с IB.

pitrik2

и как это решит проблему?
если закомментить код то он выполняться же не будет

0000

Именно, надо отрубить IB. Поскольку может быть просто ADO пытается таблицу засосать и у него это не получается => надо решать проблему с ADO.

Dasar

тормозишь. используется стандартный метод "деления проблемы пополам"
выборка-то делаться будет, не делаться будет только вставка
соответственно и можно будет убедиться, что проблема в выборке или проблема в вставке

pitrik2

гы
я думал он решение проблемы в скобках указал
а это он указал как проблему найти

Dasar

для того чтобы проблему решить - сначала ее надо найти :)

Slavaga

При больших объемах почему-то ругается на Out of Memory.
Да не, здесь все просто - надо докупить больше памяти!

pitrik2

Да не, здесь все просто - надо докупить больше памяти!
кстати не факт
возможно где-то в настройках (одного из драйверов или одной из баз) есть параметр, который надо поменять чтобы все стало ок
Оставить комментарий
Имя или ник:
Комментарий: