Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.220.178.207] |
|
Сообщ.
#1
,
|
|
|
При связке TIDHTTPServer и XMLDocument столкнулся с проблемой очистки памяти TXMLDocument, а именно проблема с IXMLNode. После того как этому присвоен какой-то документ, проведена его обработка и он нигде не используется, память не освобождается...
Пробовал работу с TXMLDocument засунуть в поток. В потоке всё нормально. Убил поток, память освободилась... Столкнулся с проблемой... Так как запросы принимает IDHTTPServer, их может быть много и от разных клиентов. Время обработки запроса может быть разным для каждого запроса, и если во время выполнения более длинного запроса прийдет от другого клиента более короткий запрос, то в теории если не разделять данные, тот ответ одного может попасть к другому. В программе я такое разделял в процедуре, которая возвращает параметры procedure xxx(in1:string; in2:integer; var out1:string; out2:integer); begin out1:=in1; out2:=in2; end; ... var myOutStr:string; myOutInt:integer; ... xxx('myInSTR', 5, myOutStr, myOutInt); Таким образом обратившись к данной процедуре из любого места с любыми входящими данными я буду уверен что тот кто запросил выполнение данной процедуры, получит именно свой ответ, и данные не поменяются Теперь вопрос: Как похожую процедуру реализовать но в потоке, т.е. В поток передать несколько параметров, и так-же получить из потока несколько параметров? synchronize(mySync) // так не подойдет потому что запрос, который обрабатывает сервер, и ответ клиенту обрабатывается внутри одной процедуры procedure TForm1.IDHTTPServerCommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); ... и мне нужно отправить данные на обработку в поток, и когда он закончит обработку, отправить их тому клиенту что запросил эту операцию, а не другому, что подключился тоже к серверу, и запросил свою операцию... |
Сообщ.
#2
,
|
|
|
Ты что-то не так делаешь. Не может он течь.
Подключи вывод инфы об утечках (ReportMemoryLeaksOnShutdown). Сделай простейший тест (в цикле создавай документ, загружай файл, освобождай), посмотри на прирост памяти |
Сообщ.
#3
,
|
|
|
Цитата Fr0sT @ Делал После 100000 раз (а загружал xml в котором только один параметр, а мне много нужно) память программы с 12мБ до примерно 80мБ в памяти После каждого присвоения документа IIxmlNode память увеличивается. Пробовал и на статическом компоненте, и на созданном динамически. Как только выполнил var RootNode: IXMLNode; ... RootNode := xmll_in.DocumentElement; Так сразу память и растёт. Если IXMLnode не использовать то всё нормально, но без этого парсить никак. Если это делать в потоке, то при убивании потока память освобождается Добавлено Поэтому и хочу в потоке это делать. З.Ы. Пробовал работу с XML засунуть в библиотеку (dll) результат такой-же самый |
Сообщ.
#4
,
|
|
|
Цитата dreyqq @ После 100000 раз (а загружал xml в котором только один параметр, а мне много нужно) память программы с 12мБ до примерно 80мБ в памяти Так это ж копейки, на уровне стартового выделения памяти. Попробуйте погонять всю ночь в бесконечном цикле - если память далее расти не будет, то никакая это не утечка, а обычная ahead-аллокация памяти "на вырост". |
Сообщ.
#5
,
|
|
|
+1. Менеджер памяти не отдает ОС часть оперативы, хранит для последующих выделений.
Для отслеживания утечек есть специальные инструменты. Либо да, грузи 1 Мб XML в цикле на ночь и смотри, будет ли расти память. Сейчас у тебя условия за пределами разрядной сетки. Условно говоря, ты стоишь в пещере и пытаешься увидеть, как растет сталактит. |
Сообщ.
#6
,
|
|
|
out of memory вылетает после 400-500Мб в памяти. В системе 4Гб.
Пробовал TXMLDocument создавать не в nil а на созданной для этого форме, и после выполнения убивать форму. Это работает. Память освобождает, НО!!! Если делать это не в модуле формы, а в модуле без формы, то создать компонент на форме не выходит, ошибка при компилировании. Добавлено Только скорость заметно падает |
Сообщ.
#7
,
|
|
|
Цитата dreyqq @ Пробовал TXMLDocument создавать не в nil а на созданной для этого форме, и после выполнения убивать форму. Это работает. Ты каким-то хаотичным тыком занимаешься. Замеры по времени, тестовые данные, реакция инструмента отслеживания утечек наконец? А то так дошаманишься до того, чтобы каждый XML создавать в отдельном процессе, лишь бы память сама очищалась |