Форум: "Базы";
Текущий архив: 2007.07.01;
Скачать: [xml.tar.bz2];
ВнизПри переливе из gdb-ки в dbf-ку - сообщение "Out of memory" Найти похожие ветки
← →
greg123 (2007-04-04 09:04) [0]Программа переливает из одной таблицы формата *.gdb в несколько dbf-файлов(в итоге каждый dbf файл должен содержать по 250-300 тыс. записей). Перелив идет по принципу созлается первая дбф-ка - туда заливается информация, создается следующая и т.д. В районе третьей дбф-ки выдается сообщение "Out of memory". Как избавиться от этой ошибки?
Заранее спасибо
← →
Ильичев С.А. © (2007-04-04 09:06) [1]код покажи
← →
greg123 (2007-04-04 09:10) [2]CreateLTable(dbf_name);
dm.DBF.Active:=false;
dm.DBF.TableName:=dbf_name;
try
dm.DBF.Active:=true;
except
end;
dm.q_db.Active := false;
dm.q_db.SQL.Clear;
dm.q_db.SQL.Text := CreateTextZapros(i);
try
dm.q_db.Active := true;
except
end;
if dm.q_db.RecordCount<>0 then
begin
k:=0;
while not dm.q_db.Eof do
begin
dm.DBF.Insert;
сдесь идет перечисление полей
dm.DBF.Post;
inc(k);
dm.q_db.Next;
end;
end;
dm.DBF.Active:=false;
end;
← →
Sergey13 © (2007-04-04 09:13) [3]> [2] greg123 (04.04.07 09:10)
В таком случае не надо вставлять данные в датасет. Надо напрямую инсертить в таблицу, без открытия датасета.
← →
greg123 (2007-04-04 09:16) [4]как это сделать?
← →
Sergey13 © (2007-04-04 09:20) [5]> [4] greg123 (04.04.07 09:16)
Так и сделать. Написать Insert-запрос, желательно параметрический (в принципе для дбф-ки это пофиг, но лучше привыкать к хорошему) и выполнять его в цикле, заполнив параметры значениями из исходной БД.
← →
greg123 (2007-04-04 09:30) [6]спасибо
← →
Виталий Панасенко(дом) (2007-04-04 09:42) [7]НД, который читает сделай однонаправленным..
← →
Jan1 (2007-04-04 10:12) [8]
> try
> dm.q_db.Active := true;
> except
> end;
сильно
> if dm.q_db.RecordCount<>0 then
if not dm.q_db.IsEmpty then
> inc(k);
зачем?
> dm.q_db.SQL.Clear;
лишнее
А вообще лучше заюзал бы TBatchMove
← →
Ильичев С.А. © (2007-04-04 11:44) [9]по этому куску не понятно где течёт
что есть
CreateLTable(dbf_name);
CreateTextZapros(i);
← →
Ильичев С.А. © (2007-04-04 11:49) [10]и таинственное "перечисление полей" конечно тоже
← →
Карелин Артем © (2007-04-04 12:02) [11]
> Ильичев С.А. © (04.04.07 11:44) [9]
Лолично предположить, что это создание файла таблицы и текста запроса. А перечисление полей это полсотни строчек вида dm.DBF.Fields[...].Value=dm.q_db.Fields[...].Value
← →
Ильичев С.А. © (2007-04-04 12:20) [12]2 Карелин Артем © (04.04.07 12:02) [11]
логично предположить что если лика нет там где мы видим
то он там где мы не видим
← →
Карелин Артем © (2007-04-04 13:40) [13]
> Ильичев С.А. © (04.04.07 12:20) [12]
У человека банальная ситуация, когда 2 больших набора данных занимают в памяти слишком большой объем информации. 5 и 7 ответы исчерпывающие в данной ситуации.
← →
Карелин Артем © (2007-04-04 13:53) [14]P.S. Если использовать IBSQL для чтения данных скорость увеличится.
← →
Ильичев С.А. © (2007-04-04 15:37) [15]2 Карелин Артем
У человека ситуация когда он не закрывает то что открывает
и поэтому эксепшн "..В районе третьей дбф-ки.."
а не в районе первой, когда ноборов данных именно 2
← →
Jan1 (2007-04-04 15:40) [16]
> P.S. Если использовать IBSQL для чтения данных скорость
> увеличится.
он не читает данных. он их пишет.
← →
Карелин Артем © (2007-04-04 16:16) [17]
> Ильичев С.А. © (04.04.07 15:37) [15]
Наборов данных в данном случае всегда 2. Один читает, другой пишет.
> Jan1 (04.04.07 15:40) [16]
Читает из gdb и пишет в dbf.
← →
Ильичев С.А. © (2007-04-04 16:22) [18]2 Карелин Артем
> в данном случае всегда 2
Вы это логично предположили из того что вам показали?
мне в таком случае интересна Ваша версия возникновения
указанной ошибки "Out of memory"
← →
Jan1 (2007-04-04 16:27) [19]
> Читает из gdb и пишет в dbf.
каким образом он их читает из gdb?
← →
Карелин Артем © (2007-04-04 16:30) [20]
dm.q_db.Active := false; //закрыли набор данных от прошлой итерации
Аналогично для пишущего набора. Вот только в конце всех циклов останется открытым читающий набор.
dm.q_db.SQL.Clear;
dm.q_db.SQL.Text := CreateTextZapros(i);//создали запрос на текущую итерацию
try
dm.q_db.Active := true;//открыли набор данных
except
end;
Ошибка возникает потому что несколько сотен тысяч строк в обоих наборах данных к концу второй итерации просят такой обьем памяти, который виндовс уже предоставить не может.
← →
Карелин Артем © (2007-04-04 16:34) [21]
> Jan1 (04.04.07 16:27) [19]
см 2
← →
Ильичев С.А. © (2007-04-04 16:38) [22]2 Карелин Артем
..несколько сотен тысяч строк в обоих наборах данных к концу второй итерации просят..
а к концу первой они разве не просили?
← →
Карелин Артем © (2007-04-04 16:41) [23]
> Ильичев С.А. © (04.04.07 16:38) [22]
В первой итерации значит меньше набор данных был ;)
← →
Ильичев С.А. © (2007-04-04 16:49) [24]2 Карелин Артем
на сколько меньше ?
← →
Карелин Артем © (2007-04-04 16:52) [25]
> Ильичев С.А. © (04.04.07 16:49) [24]
Тут мой телепатор сломался ))
← →
Jan1 (2007-04-04 17:32) [26]
> см 2
Ты путаешь IBQuery и IBSQL.
← →
Карелин Артем © (2007-04-04 19:17) [27]
> Jan1 (04.04.07 17:32) [26]
Неа
← →
Mike Kouzmine © (2007-04-05 00:15) [28]В бде возможны гетерогенные запросы. (раз уж бде используется)
← →
Jan1 (2007-04-05 10:30) [29]
> Неа
не может IBSQL вернуть данных. Посмотри его иерархию.
← →
Карелин Артем © (2007-04-05 15:36) [30]
> Jan1 (05.04.07 10:30) [29]
Он не потомок датасета, но его иерахия позволяет на порядок быстрее последовательо считывать данные.
← →
Jan1 (2007-04-05 15:45) [31]
> Карелин Артем © (05.04.07 15:36) [30]
да!
чего-то я не догнал :) сорри.
← →
SlymRO © (2007-04-05 15:52) [32]Карелин Артем © (04.04.07 12:02) [11]
А перечисление полей это полсотни строчек вида dm.DBF.Fields[...].Value=dm.q_db.Fields[...].Value
чур меня...
Это скоко по времени будет на 300 тыс записей?
greg123 (04.04.07 9:10) [2]
if dm.q_db.RecordCount<>0 then
Попытка зафетчить весь датасет...
убери эту проверку хватит while not dm.q_db.Eof do
ServerCursor + однонаправленность
← →
Карелин Артем © (2007-04-05 17:41) [33]
> SlymRO © (05.04.07 15:52) [32]
> Это скоко по времени будет на 300 тыс записей?
Меньше намного чем сама запись в DBF.
← →
Mike Kouzmine © (2007-04-06 02:00) [34]Делаешь три процедуры, формирующие наборы для 3 файлов и напрямую из них лить в дбф с помощье гетерогенного инсертного запроса.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2007.07.01;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.005 c