|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Проблема: Рост потребляемой памяти при работе с WMI. |
|
[решено] Проблема: Рост потребляемой памяти при работе с WMI.
|
Новый участник Сообщения: 46 |
Профиль | Отправить PM | Цитировать Вот пример:
Проблема в том, что со временем (в данном примере это видно уже через минуту) начинает расти потребление памяти. Как этого избежать? |
|
Отправлено: 22:58, 05-10-2009 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Вообще то не обязательно использовать столько циклов, просто переделываем функцию немного(?):
#include <Array.au3> $aOwners = _ProcessesGetOwner('svchost.exe') _ArrayDisplay($aOwners) Func _ProcessesGetOwner($sPID_Name, $sComputer = ".") Local $objWMI, $colProcs, $sUserName, $sUserDomain, $aRet_Owners[1][2] $objWMI = ObjGet("winmgmts:\\" & $sComputer & "\root\cimv2") If Not IsObj($objWMI) Then Return SetError(1, 0, 0) $colProcs = $objWMI.ExecQuery("SELECT * FROM Win32_Process", "WQL", 0x30) If Not IsObj($colProcs) Then Return SetError(2, 0, 0) For $iProc In $colProcs If $iProc.Caption = $sPID_Name Then If $iProc.GetOwner($sUserName, $sUserDomain) Then ContinueLoop $aRet_Owners[0][0] += 1 ReDim $aRet_Owners[$aRet_Owners[0][0]+1][2] $aRet_Owners[$aRet_Owners[0][0]][0] = $iProc.ProcessID $aRet_Owners[$aRet_Owners[0][0]][1] = $sUserDomain & "\" & $sUserName EndIf Next Return $aRet_Owners EndFunc |
------- Отправлено: 05:09, 06-10-2009 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 46
|
Профиль | Отправить PM | Цитировать Спасибо за исправленный вариант, но проблема в том, что если процесс периодически выполняет ф-ю _ProcessesGetOwner() (например, как в моем примере выше сунуть для наглядности в бесколечный луп), то объем занимаемой памяти неуклонно растет. И чем меньше слип, тем быстрее.
У меня на серваке крутится скрипт, который через пол дня начинает заметно жрать память. Бывало, что по несколько сотен метров, если его не перезапускать. |
Отправлено: 07:05, 06-10-2009 | #3 |
Старожил Сообщения: 215
|
Профиль | Отправить PM | Цитировать Создай сам объект вне функции. И пропиши его в качестве параметра для функции.
|
------- Отправлено: 07:42, 06-10-2009 | #4 |
Новый участник Сообщения: 46
|
Профиль | Отправить PM | Цитировать SyDr, Точно! Помогло.
А с чем сей косяк связан? Вот пример, если кому не понятно будет: $objWMI = ObjGet("winmgmts:\\.\root\cimv2") While 1 $aProcess = ProcessList('svchost.exe') For $i = 1 To $aProcess[0][0] _ProcessGetOwner($aProcess[$i][1]) Next Sleep(10) WEnd Func _ProcessGetOwner($PID) Local $colProcs, $sUserName, $sUserDomain If IsObj($objWMI) Then $colProcs = $objWMI.ExecQuery("Select ProcessId From Win32_Process Where ProcessId="& $PID) If IsObj($colProcs) Then For $Proc In $colProcs If $Proc.GetOwner($sUserName, $sUserDomain)=0 Then Return $sUserDomain & "\" & $sUserName Next EndIf EndIf EndFunc |
|
Отправлено: 21:32, 06-10-2009 | #5 |
Старожил Сообщения: 215
|
Профиль | Отправить PM | Цитировать Скорее всего с тем, что сам объект всё ещё остаётся в памяти. Ты каждый раз при вызове функции создаёшь новый объект. Однако, похоже, что даже если он является локальным - после выхода из функции он не уничтожается. Вторым вариантом могу предложить обнулять переменную-объект перед выходом из функции. Вроде бы так тоже можно избавиться от роста потребляемой памяти. Поправьте меня, если я не прав. Однако, если объект испольузется больше двух раз - зачем постоянно создавать новый?
По русски всё выглядит так (ну, допустим, ты используешь объект 5 раз): Какой вариант использовать - решать тебе |
------- Отправлено: 08:30, 07-10-2009 | #6 |
Пользователь Сообщения: 60
|
Профиль | Отправить PM | Цитировать Цитата:
Интересно, какой будет результат, если $colProcs тоже сделать глобальным? |
|
Отправлено: 16:15, 07-10-2009 | #7 |
Новый участник Сообщения: 46
|
Профиль | Отправить PM | Цитировать SyDr,
Цитата SyDr:
|
|
Отправлено: 06:03, 08-10-2009 | #8 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Разное - x64 - рост потребления памяти | al_leb | Microsoft Windows 2000/XP | 2 | 22-12-2008 14:35 | |
NOD32 (версия 3.0.650) Проблема при работе с Outlook Express и Mozilla Thunderbird | geshman | Лечение систем от вредоносных программ | 2 | 24-11-2008 14:59 | |
Проблема при работе с сайтами | Forst | Хочу все знать | 1 | 25-05-2008 11:02 | |
Интерфейс - При длительной работе возникается проблема с проводником и IE | Sparkster | Microsoft Windows Vista | 1 | 28-01-2008 09:20 | |
Прочие БД - Проблема при работе в Access 2003 | ЗВВ | Программирование и базы данных | 2 | 18-01-2008 22:43 |
|