Подскажите в чем может быть проблема, и проблема ли это вовсе. Работают параллельно 5 одинаковых скриптов. Проверяют пиксели, жмакают мышку, клавиатуру. Проверяют положение активного окна. Иногда чтото печатают. Периодически делают скриншоты привязанного окна. Регулярно показывают подсказку, что скрипт в данный момент себе думает/делает.
Спустя примерно часа такой деятельности, UOpilot увеличивает кол-во занимаемой ОЗУ компьютера на 50мб. Спустя примерно полтора суток, когда порог приближается к 2гб, перестают работать некоторые команды и функции (не делаются скрины, не читается цвет пикселей).
Как с этим бороться? Что такое важное в таком размере пилот начинает хранить в памяти? Можно ли как-то сбросить у него из мозгов этот хлам? Каккие команды его так напрягают? Подскажите пожалуйста кто что знает.
DarkMaster
2.10.2020, 17:36
Кандидат номер один на данную проблему getimage, при условии, что вы не освобождаете память после того, как изображение более не требуется. Примерно та же проблема может произойти, если вы постоянно собираете что-то в массив с новыми индексами либо создаете новые массивы.
Да, GetImage используется часто и конечно же, из памяти я ничего не удаляю ибо считал, что оно по типу переменной - просто переписывается. Попробую удалять из памяти и посмотреть, что получится. Спасибо Вам за совет, DarkMaster.
DarkMaster
2.10.2020, 17:46
Все верно, DarkMaster, вы как всегда даете очень полезный совет. Добавив строку DeleteImage, память перестала расхищаться из ресурсов компьютера в таких крупных масштабах. За сутки, размер UOpilot в памяти увеличился с 19мб до 190. Это уже на так критично, хватит работы на несколько дней без перегрузки, пока не начнутся перебои.
Цитата(фонарик @ 5.10.2020, 22:35)
размер UOpilot в памяти увеличился с 19мб до 190.
Добавьте эту строку в ваш скрипт
collectgarbage ("collect").
mymerlin
17.10.2020, 12:26
Цитата(Fors1k @ 7.10.2020, 1:45)
Добавьте эту строку в ваш скрипт collectgarbage ("collect").
Это для Lua или для обычного UO тоже подойдёт? не нашёл ничего про эту функцию в документации
DarkMaster
17.10.2020, 12:28
Это только для луа. Вызов коллектора, как правило, ни к чему не приводит, т.к. он вызывается автоматически виртуальной машиной луа.
Цитата(mymerlin @ 17.10.2020, 12:26)
Это для Lua или для обычного UO тоже подойдёт? не нашёл ничего про эту функцию в документации
Просто перезаписываем одну и ту же переменную
Код
--lua
log 'clear';log 'mode compact'
-- Создадим файл для теста
require"luaposh";PScode('return',{[[#}
#
[IO.File]::WriteAllLines("C:\files\test.txt", [Linq.Enumerable]::Repeat("aaaaaaaaaaaa",3000000))
#
]]})
-- Прочитаем файл в переменную
file = io.open([[C:\files\test.txt]], "r");data = file:read("*a");file:close()
-- Второй раз читаем файл в туже переменную без чистки памяти
file = io.open([[C:\files\test.txt]], "r");data = file:read("*a");file:close()
-- Ждем
for i=1, 1000 do wait(2) end
-- Третий раз читаем файл в туже переменную без чистки памяти
file = io.open([[C:\files\test.txt]], "r");data = file:read("*a");file:close()
-- Ждем
for i=1, 1000 do wait(2) end
-- Смотрим результат
memUsed = math.modf(collectgarbage ("count"))
log("занято памяти : "..memUsed)
занято памяти : 103708
Используем collectgarbage
Код
--lua
log 'clear';log 'mode compact'
-- Создадим файл для теста
require"luaposh";PScode('return',{[[#}
#
[IO.File]::WriteAllLines("C:\files\test.txt", [Linq.Enumerable]::Repeat("aaaaaaaaaaaa",3000000))
#
]]})
-- Прочитаем файл в переменную
file = io.open([[C:\files\test.txt]], "r");data = file:read("*a");file:close()
-- Второй раз читаем файл в туже переменную и чистим память
file = io.open([[C:\files\test.txt]], "r");data = file:read("*a");file:close()
collectgarbage ("collect")
-- Ждем
for i=1, 1000 do wait(2) end
-- Третий раз читаем файл в туже переменную и чистим память
file = io.open([[C:\files\test.txt]], "r");data = file:read("*a");file:close()
collectgarbage ("collect")
-- Ждем
for i=1, 1000 do wait(2) end
-- Смотрим результат
memUsed = math.modf(collectgarbage ("count"))
log("занято памяти : "..memUsed)
занято памяти : 54554
Разница 49мб
DarkMaster
17.10.2020, 16:49
Цитата
Разница 49мб
Цитата
как правило, ни к чему не приводит
Сборщик мусора вызывается в определенном соотношении к операциям выделения памяти. Т.е. грубо говоря обожравшаяся программа со временем похудеет, если этот хлам уже не нужен. Поэтому КАК ПРАВИЛО, но не всегда. Для "особых" случаев ручной вызов и есть.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста,
нажмите сюда.