Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Проблема: Рост потребляемой памяти при работе с WMI.

Ответить
Настройки темы
[решено] Проблема: Рост потребляемой памяти при работе с WMI.

Аватара для timsky

Новый участник


Сообщения: 46
Благодарности: 10

Профиль | Отправить PM | Цитировать


Вот пример:
читать дальше »
Код: Выделить весь код
While 1
    $aProcess = ProcessList('svchost.exe')
    For $i = 1 To $aProcess[0][0]
        _ProcessGetOwner($aProcess[$i][1])
    Next

    Sleep(10)
WEnd

Func _ProcessGetOwner($PID, $sComputer = ".")
    Local $objWMI, $colProcs, $sUserName, $sUserDomain
    $objWMI = ObjGet("winmgmts:\\" & $sComputer & "\root\cimv2")
    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


Проблема в том, что со временем (в данном примере это видно уже через минуту) начинает расти потребление памяти.
Как этого избежать?

Отправлено: 22:58, 05-10-2009

 

Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить 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

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 05:09, 06-10-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для timsky

Новый участник


Сообщения: 46
Благодарности: 10

Профиль | Отправить PM | Цитировать


Спасибо за исправленный вариант, но проблема в том, что если процесс периодически выполняет ф-ю _ProcessesGetOwner() (например, как в моем примере выше сунуть для наглядности в бесколечный луп), то объем занимаемой памяти неуклонно растет. И чем меньше слип, тем быстрее.

У меня на серваке крутится скрипт, который через пол дня начинает заметно жрать память. Бывало, что по несколько сотен метров, если его не перезапускать.

Отправлено: 07:05, 06-10-2009 | #3


Аватара для SyDr

Старожил


Сообщения: 215
Благодарности: 62

Профиль | Отправить PM | Цитировать


Создай сам объект вне функции. И пропиши его в качестве параметра для функции.

-------

"Что мы думаем, знаем или во что верим в конце концов не так уж и важно.
Важно лишь то, что мы делаем."
Джон Раскин

Это сообщение посчитали полезным следующие участники:

Отправлено: 07:42, 06-10-2009 | #4


Аватара для timsky

Новый участник


Сообщения: 46
Благодарности: 10

Профиль | Отправить 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


Аватара для SyDr

Старожил


Сообщения: 215
Благодарности: 62

Профиль | Отправить PM | Цитировать


Скорее всего с тем, что сам объект всё ещё остаётся в памяти. Ты каждый раз при вызове функции создаёшь новый объект. Однако, похоже, что даже если он является локальным - после выхода из функции он не уничтожается. Вторым вариантом могу предложить обнулять переменную-объект перед выходом из функции. Вроде бы так тоже можно избавиться от роста потребляемой памяти. Поправьте меня, если я не прав. Однако, если объект испольузется больше двух раз - зачем постоянно создавать новый?
По русски всё выглядит так (ну, допустим, ты используешь объект 5 раз):
читать дальше »
Создать объект
Получить данные
Создать объект
Получить данные
Создать объект
Получить данные
Создать объект
Получить данные
Создать объект
Получить данные

читать дальше »
Создать объект
Получить данные
Унижтожить объект
Создать объект
Получить данные
Унижтожить объект
Создать объект
Получить данные
Унижтожить объект
Создать объект
Получить данные
Унижтожить объект
Создать объект
Получить данные
Унижтожить объект

читать дальше »
Создать объект
Получить данные
Получить данные
Получить данные
Получить данные
Получить данные
Унижтожить объект

Какой вариант использовать - решать тебе

-------

"Что мы думаем, знаем или во что верим в конце концов не так уж и важно.
Важно лишь то, что мы делаем."
Джон Раскин


Отправлено: 08:30, 07-10-2009 | #6


Аватара для Sp01LeR

Пользователь


Сообщения: 60
Благодарности: 13

Профиль | Отправить PM | Цитировать


Цитата:
А с чем сей косяк связан?
Я думаю, что косяк связан с запросом в базу для локального обьекта $objWMI (каждый запрос создает новый обьект)...
Интересно, какой будет результат, если $colProcs тоже сделать глобальным?

Отправлено: 16:15, 07-10-2009 | #7


Аватара для timsky

Новый участник


Сообщения: 46
Благодарности: 10

Профиль | Отправить PM | Цитировать


SyDr,
Цитата SyDr:
Вторым вариантом могу предложить обнулять переменную-объект перед выходом из функции. Вроде бы так тоже можно избавиться от роста потребляемой памяти. »
Пробовал, бесполезно. Помогло именно твое первое решение.

Отправлено: 06:03, 08-10-2009 | #8



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Проблема: Рост потребляемой памяти при работе с WMI.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - 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




 
Переход