Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-1178039859
Sviridov
2007-05-01 21:17
2007.07.01
Создание отчетов с возможностью сохранения шаблонов


2-1181452437
Karl
2007-06-10 09:13
2007.07.01
сравнение TStringList и первого столбца ListView


2-1181295060
webpauk
2007-06-08 13:31
2007.07.01
array of Timage


11-1163751537
Kirill
2006-11-17 11:18
2007.07.01
KolODBC


11-1164190686
Don
2006-11-22 13:18
2007.07.01
Minimize / Restore главного окна





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский