![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SOS!!!!!!! Недостаток физической памяти!
Raduga © (2003-05-06 18:17:00)Здравствуйте, написал программу которая постоянно пишет данные в БД. Через месяц беспрерывной работы вылезло сообщение Windows: что-то про недостаток физической памяти. В своей проге для работы с БД испоьзую ADO (компоненты ADOTable, ADOConnection), БД - Access. Как устранить данную ошибку.
Спасибо.
Raduga (2003-05-22 16:09:00) [1]Не знаю, может неправильно сделал, но вносил за раз по 10000 записей, после каждого раза разрывал коннект с провайдером, а потом заново коннектился. Память стабильно колеблится около некоторой величины.
sniknik (2003-05-21 20:45:00) [2]Raduga (21.05.03 19:13)
я написал 3.5, намек на то что может устаревший, попробуй обновить все подряд по очереди jet, mdac, сервис паки к дельфям. потому как делал тоже (ну как ты описал) пустой проэкт 2 ADO компонента команд и конект и инсерт на таймере. пямять у проэкта1 при старте около 6628 и втечении минуты/пол подымается максимум до 6724 и все стоит. положил в базу (определял по автоикременту он же ключь, кстати проверь если нет ключа для индетификации полная запись используется, памяти больше требуется) 1025 записей, больше не растет. запрос анологично твоему без параметров.
Raduga (2003-05-21 19:13:00) [3]>sniknik © (21.05.03 18:49)
Именно так : Provider=Microsoft.Jet.OLEDB.4.0
Anatoly Podgoretsky (2003-05-21 18:57:00) [4]Raduga (21.05.03 18:16)
Размер страницы
sniknik (2003-05-21 18:49:00) [5]покажи строку подключения,
а то если у тебя там стоит Jet.OLEDB.3.5(к примеру) то я ничему удивлятся не буду. (так уж и быть ;о))
Raduga (2003-05-21 18:16:00) [6]И почему-то память растет строго на 4 кило.
Raduga (2003-05-21 18:11:00) [7]>Johnmen © (21.05.03 17:43)
>Количество выполнений указанного запроса на размер свободной памяти никак не влияет...
Ради интереса наваял сейчас проектик с нуля.
В таимере пишу в мою таблицу
Adocommand1.commandtext:="insert into mytable values (1,2,"example")";
ADoCommand1.execute;
все, больше ничего не делаю.
И что, смотрю в виндовсом диспечере задач - память занимаемая прогой растет! И интересно до каких пор, если прогу запустить на достаточно долгое время?
Serginio (2003-05-21 18:00:00) [8]В принцыпе такая вещь возможна из-за фрагментации памяти и постоянных реалоках.Классический пример TMemoryStream при выделении памяти свыше 6 мб начинает быстро глохнуь и в конце выдает ошибку выделения памяти. Но при постояном и правильном выделении памяти и освобождении такое маловероятно.
sts (2003-05-21 17:47:00) [9]ADOConnection.BeginTrans
инсерты
ADOConnection.CommitTrans
sniknik (2003-05-21 17:46:00) [10]Raduga (21.05.03 17:15)
ну если ты так уверен что ADO компоненты виноваты, ну делай им время от времени закрытие и освобождение (free) с последующим пересозданием естественно, должно однозначно освобождать используемую ими память, если не получится причина в другом.
только нужно всемADO компонентам делать, если коннекты (хоть один) останутся ядро не выгрузится.
Johnmen (2003-05-21 17:43:00) [11]Количество выполнений указанного запроса на размер свободной памяти никак не влияет... Дело в чем-то другом...
Raduga (2003-05-21 17:15:00) [12]>koks © (21.05.03 16:59)
Принципиальной разницы нет, как память то всеравно растет!
koks (2003-05-21 17:01:00) [13]и кроме того я бы рекомновал использовать явную транзакцию(и)
koks (2003-05-21 16:59:00) [14]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;
<конец цикла>
Raduga (2003-05-21 16:30:00) [15]>koks
Делаю так:
Adocommand1.commandtext:="insert into mytable values (1,2,"example")";
ADoCommand1.execute;
На счет транзакций,я их не использую (или они ипользуются по умолчанию?)
koks (2003-05-21 16:19:00) [16]значит ты не так все делаешь.
Если используешь ADO-подключение... там же ведь есть транзакции, которые нужно завершать.
Raduga (2003-05-21 15:58:00) [17]Нужда заставила вновь поднять эту тему.
Пробовал инсертом вставлять, не помогает.
Память растет.
У меня подозрение, что для того чтобы вставить запись, таблица все равно неявно загружается в память.
И еще , как мне освободит память после выполнения sql-запроса (в компоненте квери), по клозу память не освобождается.
roottim (2003-05-07 16:54:00) [18]insert into ... главная
insert into ... подчиненная
Raduga (2003-05-07 15:57:00) [19]А если таблица в которую я пишу имеет подчиненную и в подчинненую тоже надо записывать?
victor_ch (2003-05-07 13:10:00) [20]ответ sniknik
> Как устранить данную ошибку
ADOConnection + ADOCommand + "insert into ..." для добавления и никаких таблиц
все что тебе нужно
вставляешь раз в минуту одну запись
и никаких лишних расходов памяти,
а у тебя с помощью ADOTable
вся таблица висит памяти, естественно ее не хватает, т.к таблица все время увеличивается в размере