Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.01;
Скачать: CL | DM;

Вниз

При переливе из 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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.014 c
11-1163196318
Shinjo
2006-11-11 01:05
2007.07.01
TreeView с CheckBox ами


2-1181005649
anna
2007-06-05 05:07
2007.07.01
помогите пожалуйста решить задачку


2-1181487281
имя
2007-06-10 18:54
2007.07.01
RichEdit меняет шрифт


2-1181227245
webpauk
2007-06-07 18:40
2007.07.01
Открыть файл


15-1180805387
Fman
2007-06-02 21:29
2007.07.01
Перехватить соединение.