Форум: "Базы";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];
ВнизОбъем данных - 4,5 млн записей: не хватает вирт.памяти Найти похожие ветки
← →
RUYurik (2004-01-15 07:59) [0]Всем приятного времени суток!
У меня вопрос: использую IBExtract для выгрузки данных. Только в одной таблице - 4,5млн. записей, а я таких 6 таблиц объединяю.
При Extr2.ExtractObject(eoTable,"PEOPLE",[etData]) ругается "Не хватает виртуальной памяти". Как быть, или что использовать для выгрузки этих данных в подготовленном виде, типа "Insert into..." и чтобы памяти много не ело?
← →
Flagman (2004-01-15 08:05) [1]Попробуй IBExpert, я им пользуюсь. Правда с таким объемом данных не пробовал, но может потянет. А в принципе, можно просто самому построитель запроса написать - там же строчка типовая...
← →
RUYurik (2004-01-15 08:10) [2]Я в программе использую это, не хотелось бы пользоваться IBExprt"ом.
← →
jack128 (2004-01-15 08:19) [3]А ручками никак? Имхо не так их и сложно..
← →
Flagman (2004-01-15 08:25) [4]Насколько я понимаю, нужно сгенерить текстовый запрос типа:
INSERT INTO TBL1(N1, N2,...) VALUES (V11, V21,...);
INSERT INTO TBL1(N1, N2,...) VALUES (V12, V22,...);
INSERT INTO TBL1(N1, N2,...) VALUES (V13, V23,...);
...
...
INSERT INTO TBL1(N1, N2,...) VALUES (V10003, V20003,...);
...
COMMIT;
Т.к. Vх везде и всюду тебе известно, можно генерить просто текстовый файл. Причем коммит должен стоять через разумные количества строк (напр. через 500). Потом вызвать его в IBQuery (или FIBQuery) и выполнить.
Кроме того можно саму генерацию делать после каждого коммита для новой порции данных - тогда вообще можно будет не оглядываться какие у тебя объемы данных...
За точность синтаксиса не ручаюсь, ежели что проверить можно в том же IBExpert"е ... ;)
← →
jack128 (2004-01-15 08:42) [5]Проблема в том ibextract все твои 4.5 миллиона записей stringlist загоняет. Точнее пытается загнать :-) Решение
> jack128 © (15.01.04 08:19) [3]
← →
Flagman (2004-01-15 08:59) [6]2 jack128:
Я и говорю - разумно было бы их порезать на небольшие куски и кидать по очереди...
← →
RUYurik (2004-01-15 09:26) [7]
> jack128 © (15.01.04 08:42) [5]
Именно так и есть, он все загоняет в StringList, а как можно порезать на куски например по 10000 записей? В IBExtract по моему нет такого. А насчет ручками, если так не получится, то конечно пойду более длинным путем - буду ручками генерить sql-текст
← →
jack128 (2004-01-15 09:41) [8]
> RUYurik © (15.01.04 09:26) [7]
Я только сейчас обратил внимание на этот компонент, я им не пользовался, поэтому не знаю насчет его возможностей..
А порезать можно так
копируешь код TIbExtract.ListData, только вместо FMetaData.Add(Line) - пишешь WriteLn(ScriptFile, Line);
← →
RUYurik (2004-01-15 09:56) [9]
> jack128 © (15.01.04 09:41) [8]
Там свойства ListData нет, есть Items (сам стринглист)
← →
Flagman (2004-01-15 10:18) [10]Если я все правильно понял в хелпе по IBExtract, то логичнее сделать так:
вместо Extr2.ExtractObject(eoTable,"PEOPLE",[etData])
нужно написать хранимую процедурку, которая будет делать выборку из PEOPLE по двум параметрам: от ID1 до ID2 (по ключевому полю)
разница между ID1 и ID2 - количество строк какое нужно, и писать уже так:
Extr2.ExtractObject(eoProcedure ,"FROM_PEOPLE",[etData])
← →
Flagman (2004-01-15 10:20) [11]И крутить в цикле:
Создал процедуру;
Сделал экспорт;
Убил процедуру;
И так пока записи не кончатся...
← →
RUYurik (2004-01-15 10:36) [12]Нет, это не выход для меня. Я не хочу трогать структуру базы
← →
Flagman (2004-01-15 10:40) [13]А чем это чревато? Фактически ты ничего и не потрогаешь ;)
Процедуры надо за собой убирать после работы да и все...
← →
Danilka (2004-01-15 10:41) [14]а в чем проблема?
самому процедуру дельфовую написать быстрее, чем живет эта тема. :))
и объем кода на порядок меньше, чем весит эта ветка. :))
← →
Desdechado (2004-01-15 10:44) [15]что значит "6 таблиц объединяю" - сливаешь в одну?
тогда
insert into tbl select * from tbl1
insert into tbl select * from tbl2
и т.д.
← →
RUYurik (2004-01-15 11:01) [16]
> Danilka © (15.01.04 10:41) [14]
Вы не посмотрели наверное - в одной таблице только 4,5 млн. записей
> Desdechado © (15.01.04 10:44) [15]
они в разных базах находятся
> Flagman © (15.01.04 10:40) [13]
Скорей всего иак и сделаю, тут как раз удобство еще и в том что на стороне сервера все енто будет крутиться
← →
Flagman (2004-01-15 11:04) [17]2 RUYurik
Я уже года 2 вообще все расчеты на SP делаю, а на клиента только отображение результатов скидываю, да ввод параметров ;))
← →
Danilka (2004-01-15 11:08) [18]
> [16] RUYurik © (15.01.04 11:01)
> Вы не посмотрели наверное - в одной таблице только 4,5 млн.
> записей
И что? Хоть три записи, хоть тридцать три мильёна. Размер процедуры от этого не зависит. :))
← →
RUYurik (2004-01-15 11:23) [19]2 Danilka
> И что? Хоть три записи, хоть тридцать три мильёна. Размер
> процедуры от этого не зависит. :))
В смысле хранимую? Да, об этом и говорит FlagMan
← →
Desdechado (2004-01-15 11:28) [20]если в разных базах, то как ты собрался ХП делать?
а БДЕ поддерживает в одном запросе обращение к нескольким БД
← →
Flagman (2004-01-15 11:31) [21]2 Desdechado
Какая нафиг разница сколько баз.
Процедура делает только select из источника.
Остальное сделает IBExtract.
← →
Карелин Артем (2004-01-15 12:34) [22]Использовать двунаправленные наборы данных для выборки из IB надо.
← →
Desdechado (2004-01-15 15:25) [23]2 Flagman © (15.01.04 11:31) [21]
Тогда это не одна хранимая процедура, а столько их, сколько баз. Следовательно, разница есть.
← →
jack128 (2004-01-15 17:51) [24]
> Там свойства ListData нет, есть Items (сам стринглист)
ListData - это не свойство, это protected method. Исходники надо чаще почитывать ;-)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.034 c