Вниз
Скачать: CL | DM;

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 вся ветка

Скачать: CL | DM;



Память: 0.51 MB
Время: 0.014 c
1-34815
BlackTiger
2003-06-02 19:03
2003.06.12
Чё за батва ( :) ) с динамическими массивами?


3-34761
Инна
2003-05-25 01:06
2003.06.12
вызов хп из хп несколько раз


14-35047
Grab
2003-05-27 14:25
2003.06.12
Есть ли MP3 в сети?


4-35123
Некий_программёр
2003-04-15 11:42
2003.06.12
FileMapping


1-34799
mirk
2003-06-02 13:38
2003.06.12
Чтение данных из текстового файла




   Наверх