Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.06.12;
Скачать: [xml.tar.bz2];

Вниз

SOS!!!!!!! Недостаток физической памяти!   Найти похожие ветки 

 
Raduga   (2003-05-06 18:17) [0]

Здравствуйте, написал программу которая постоянно пишет данные в БД. Через месяц беспрерывной работы вылезло сообщение Windows: что-то про недостаток физической памяти. В своей проге для работы с БД испоьзую ADO (компоненты ADOTable, ADOConnection), БД - Access. Как устранить данную ошибку.

Спасибо.


 
sniknik   (2003-05-06 18:49) [1]

> Как устранить данную ошибку
ADOConnection + ADOCommand + "insert into ..." для добавления и никаких таблиц.


 
NickBat   (2003-05-06 18:53) [2]

Хоть бы написал какая БД, сколько и как часто пишет.
Постоянно - так не бывает.


 
Raduga   (2003-05-07 11:50) [3]

>NickBat ©
>Постоянно - так не бывает
Программа пишет в БД данные с некоторого внешнего устроиства раз в минуту круглосуточно. Мне непонятно одно, почему нехватает физической памяти( 256 мб) , разве ADOTable пишет не сразу на диск или она сначала пишет все в память?



 
Sergey13   (2003-05-07 11:59) [4]

2Raduga (07.05.03 11:50)
Просто если пить по глотку пива в минуту то через пару часов лопнешь. 8-) Зачем тебе вообще Table если ты только пишешь?


 
sniknik   (2003-05-07 12:07) [5]

ADO вообще предназначено в основном для работы с рекодсетами (для серверных баз удобно), а рекордсет для таблици считай образ ее в памяти....
можно побаловаться с "тэйбледирект" или серверным курсором (немного по другому работает) но нафига? для записи он совсем не нужен.


 
Raduga   (2003-05-07 12:15) [6]

>Sergey13 ©
А что вместо него использовать?


 
victor_ch   (2003-05-07 13:10) [7]

ответ sniknik
> Как устранить данную ошибку
ADOConnection + ADOCommand + "insert into ..." для добавления и никаких таблиц

все что тебе нужно
вставляешь раз в минуту одну запись
и никаких лишних расходов памяти,
а у тебя с помощью ADOTable
вся таблица висит памяти, естественно ее не хватает, т.к таблица все время увеличивается в размере


 
Raduga   (2003-05-07 15:57) [8]

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


 
roottim   (2003-05-07 16:54) [9]

insert into ... главная
insert into ... подчиненная


 
Raduga   (2003-05-21 15:58) [10]

Нужда заставила вновь поднять эту тему.
Пробовал инсертом вставлять, не помогает.
Память растет.
У меня подозрение, что для того чтобы вставить запись, таблица все равно неявно загружается в память.
И еще , как мне освободит память после выполнения sql-запроса (в компоненте квери), по клозу память не освобождается.


 
koks   (2003-05-21 16:19) [11]

значит ты не так все делаешь.
Если используешь ADO-подключение... там же ведь есть транзакции, которые нужно завершать.


 
Raduga   (2003-05-21 16:30) [12]

>koks

Делаю так:


Adocommand1.commandtext:="insert into mytable values (1,2,"example")";
ADoCommand1.execute;

На счет транзакций,я их не использую (или они ипользуются по умолчанию?)


 
koks   (2003-05-21 16:59) [13]

ADOCommand.CommandText := "insert into mytable values(:x, :y, :z)"

далее, например в цикле

<начало цикла>
ADOCommand.Parameters.ParamByName("X").Value := 1;
ADOCommand.Parameters.ParamByName("Y").Value := 2;
ADOCommand.Parameters.ParamByName("Z").Value := "exapmle";
ADOCommand.Execute;
<конец цикла>



 
koks   (2003-05-21 17:01) [14]

и кроме того я бы рекомновал использовать явную транзакцию(и)


 
Raduga   (2003-05-21 17:15) [15]

>koks © (21.05.03 16:59)

Принципиальной разницы нет, как память то всеравно растет!


 
Johnmen   (2003-05-21 17:43) [16]

Количество выполнений указанного запроса на размер свободной памяти никак не влияет... Дело в чем-то другом...


 
sniknik   (2003-05-21 17:46) [17]

Raduga (21.05.03 17:15)
ну если ты так уверен что ADO компоненты виноваты, ну делай им время от времени закрытие и освобождение (free) с последующим пересозданием естественно, должно однозначно освобождать используемую ими память, если не получится причина в другом.

только нужно всем ADO компонентам делать, если коннекты (хоть один) останутся ядро не выгрузится.


 
sts   (2003-05-21 17:47) [18]

ADOConnection.BeginTrans
инсерты
ADOConnection.CommitTrans


 
Serginio   (2003-05-21 18:00) [19]

В принцыпе такая вещь возможна из-за фрагментации памяти и постоянных реалоках.Классический пример TMemoryStream при выделении памяти свыше 6 мб начинает быстро глохнуь и в конце выдает ошибку выделения памяти. Но при постояном и правильном выделении памяти и освобождении такое маловероятно.


 
Raduga   (2003-05-21 18:11) [20]

>Johnmen © (21.05.03 17:43)
>Количество выполнений указанного запроса на размер свободной памяти никак не влияет...

Ради интереса наваял сейчас проектик с нуля.
В таимере пишу в мою таблицу

Adocommand1.commandtext:="insert into mytable values (1,2,"example")";
ADoCommand1.execute;

все, больше ничего не делаю.
И что, смотрю в виндовсом диспечере задач - память занимаемая прогой растет! И интересно до каких пор, если прогу запустить на достаточно долгое время?


 
Raduga   (2003-05-21 18:16) [21]

И почему-то память растет строго на 4 кило.


 
sniknik   (2003-05-21 18:49) [22]

покажи строку подключения,
а то если у тебя там стоит Jet.OLEDB.3.5(к примеру) то я ничему удивлятся не буду. (так уж и быть ;о))


 
Anatoly Podgoretsky   (2003-05-21 18:57) [23]

Raduga (21.05.03 18:16)
Размер страницы


 
Raduga   (2003-05-21 19:13) [24]

>sniknik © (21.05.03 18:49)
Именно так : Provider=Microsoft.Jet.OLEDB.4.0


 
sniknik   (2003-05-21 20:45) [25]

Raduga (21.05.03 19:13)
я написал 3.5, намек на то что может устаревший, попробуй обновить все подряд по очереди jet, mdac, сервис паки к дельфям. потому как делал тоже (ну как ты описал) пустой проэкт 2 ADO компонента команд и конект и инсерт на таймере. пямять у проэкта1 при старте около 6628 и втечении минуты/пол подымается максимум до 6724 и все стоит. положил в базу (определял по автоикременту он же ключь, кстати проверь если нет ключа для индетификации полная запись используется, памяти больше требуется) 1025 записей, больше не растет. запрос анологично твоему без параметров.


 
Raduga   (2003-05-22 16:09) [26]

Не знаю, может неправильно сделал, но вносил за раз по 10000 записей, после каждого раза разрывал коннект с провайдером, а потом заново коннектился. Память стабильно колеблится около некоторой величины.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.06.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.008 c
1-34802
Hooch
2003-06-02 14:08
2003.06.12
MDIChild


6-34960
Chlavik
2003-04-09 03:12
2003.06.12
Оправка файла


3-34692
Marat111
2003-05-22 15:23
2003.06.12
Получить оповещение от базы


14-35040
Леприкон
2003-05-23 07:35
2003.06.12
Евровидение 2003


6-34953
denisww
2003-04-10 16:33
2003.06.12
Подскажите как заюзать FTP





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский