Форум: "Базы";
Текущий архив: 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