ㅤ
((P"foo" + P"bar")*P(-1)):match(str)
:з
Snusmumriken
Уу, кажется кто-то упоролся об lpeg? : )
ㅤ
Есть такое.
Snusmumriken
Да, с lpeg'ом, если такое часто повторяется в цикле - лучше скомпилить и куда-то сохранить, типа:
local patt = -P"foo" - P"bar"
for i, v in pairs(large_list) do
if patt:match(v) then ... end
end
В частых ивентах/повторах - тоже стоит.
Иначе оно будет компиляться каждый раз, это дорого, а оно может быть реюзабельным ((
Это тип просто "бесполезное предупреждение, ибо почти никто не юзает lpeg".
Yuriy
всем привет
Yuriy
есть у кого хорошие либы для отслеживания утечек памяти?
Snusmumriken
есть у кого хорошие либы для отслеживания утечек памяти?
А вот с этим сложно, потому что у луа не очень хорошая интроспекция.
Можно дёргать collectgarbage() и смотреть занимаемую приложением память, и можно смотреть структуры доступные из _G. Сборка мусора, помнится, справляется с "островами", удаляя всё что недоступно из глобальной таблицы.
Yuriy
Snusmumriken
А что, ты как-то умудрился протечь памятью? : )
Yuriy
И они понемногу растут
Yuriy
В принципе мне достаточно будет дампа G на завершении цикла я думаю
Snusmumriken
Кстати, ты это, если у тебя с collectgarbage() память в диспетчере не полностью возвращается к оригинальному значению - это не значит что течёт.
Сам процесс, запускающий луа-стейт может течь?
Yuriy
Yuriy
Yuriy
И при этом если снять нагрузку то она не кменьшается
Snusmumriken
Понял. Какие-то хранимые данные имеются? Ну там, какой-нибудь глобальный список, куда что-то складируется, типа логов/клиентов/ещё чего-то.
Yuriy
Ну вообще нет. Но всегда есть вариант что я где то оставил переменную без local)
Yuriy
Так как кода много.
Snusmumriken
С этого не должно расти. Увеличить потребление - да, расти - не особо.
Snusmumriken
Переменная просто переобъявится, старая сотрётся (если это не cdata без финалайзера).
Yuriy
Да. Я понимаю. Но там есть несколько конструкций типа a =a.. b
Yuriy
Соответственно если a забыл объявить локальной то вот тебе увеличение значения
Yuriy
Буду проверять. Вечером обнаружили
Snusmumriken
На a = a .. b - вообще пофигу.
Кстати, строковый буфер имеет свои алгоритмы, если у тебя активное использование строк - тогда строковый пул может расти-расти-расти, а потом быстро очищать миллиард строк, которые были буферизированы ранее.
Snusmumriken
Так что тут сильно можно не морочиться. Поставь свою тулзу на сутки и глянь динамику. Если не падает с memerr - норм.
Yuriy
Ну пока у меня нет других предположений) буду G смотреть. Если ничего не найду, то приду паниковать сюда)))
Но про строки спасибо. Не знал.
Yuriy
Snusmumriken
Воу
Yuriy
Ну как
Snusmumriken
А вот тут уже странно.
Yuriy
Не падает но не может обработать проуессы
Yuriy
Внешний процесс работает. Вижу память занята на всю
Snusmumriken
Хммм. Становится интереснее. В скрипте нет остановок сборщика мусора?
Yuriy
И соответственно запросы перестают обрабатываться
Yuriy
Yuriy
Там довольно высокруровнево все
Snusmumriken
Что за софтина-то?
Snusmumriken
Потому что я, например, сталкивался с тем, что крупное многопоточное приложение обрубает потоки, и не освобождает хендлеры, которые остались на луёвой стороне в момент жёсткого обрубания потока (обрубание критично по времени). С lua lanes аналогичная фигня была. Типа, убийство потоков == плохо.
Yuriy
Yuriy
Просто дело в том что на другом проекте у меня он стоит с другим кодом и так мсе норм
Yuriy
А набор либ что там что тут одинаковый
Yuriy
Там банально на каждый процесс запускается lua state и живёт. То есть если задал 8 процессов то получил 8 lua states
Yuriy
Собственно там храню некоторые глобальные вещи типа дескриптора на подключение к бд и так далее
Snusmumriken
Понял. В общем, варианты развития событий примерно следующие:
1. Ты действительно что-то не удаляешь в своих скриптах, не чистишь списки и т.п. (смотреть дамп _G)
2. При работе с сишными указателями, не вызываешь финалайзер, или сишные "объекты" (указатель + метатаблица) не имеют финалайзера
3. Какая-то непонятная фигня
Так-то пул строк на memerr должен нормально очищаться.
Snusmumriken
Тут был диалог с порно-спамером
vitaly
vitaly
я опять поздал
vitaly
😂
Snusmumriken
Ты тоже порно-спамер : )
vitaly
че предлагали то?
Snusmumriken
Фотачки "бывших грешниц". А я типа предложил залезть в гугл. А потом предложил закидать его самого фотками с бдсм-тусовок (за денежку).
vitaly
я порно-луалист
vitaly
в чате все совершеннолетние на текущий момент?
vitaly
дети вы тут?
vitaly
кому нету 19 лет подымите руки
vitaly
снус ты тут?
Snusmumriken
Я детя, так что не надо тут всего эдакого.
vitaly
все на луа 😂
vitaly
ок - все понял - ухожу - склонившись
Snusmumriken
Давай то же самое но с тестовым роликом, чо
vitaly
вот тебе на русском - прямая трансляция
vitaly
убираю
Snusmumriken
Ууу
vitaly
это “реалтайм детка”
vitaly
или “это реал-тайм, Карл”
Snusmumriken
Реал-тайм, детя, потому что я детя.
Egor
Доброго утра. Такой вопрос, можно ли вытаскивать как-то легко как в питоне значения с table? т.е. x,y,z = {1,2,3} как-то так? а то приходится идти в цикл или вызывать myvar[1] ...
Snusmumriken
unpack:
local t = {1, 2, 3}
local x, y, z, j, k = unpack(t)
print(x, y, z, j, k) --> 1 2 3 nil nil
Egor
unpack:
local t = {1, 2, 3}
local x, y, z, j, k = unpack(t)
print(x, y, z, j, k) --> 1 2 3 nil nil
Спасибо
Snusmumriken
Функция pack - отсутствует, вместо неё конструируем таблицу.
Ну там
local x, y, z = 1, 2, 3
local t = {x, y, z}
Или даже:
local t = {1, 2, 3}
local copy_t = {unpack(t)}
У луа есть неприятная штука, когда мы дёргаем функцию, возвращающую несколько значений, и после неё - ещё что-то.
local x, y, z = 4, unpack{1, 2, 3}
print(x, y, z) --> 4, 1, 2
local x, y, z = unpack{1, 2, 3}, 4
print(x, y, z) --> 1 4 nil
Множественные значения должны быть в "конце" выражения, иначе из них берётся только первое возвращаемое значение.
Можно намутить функцию-коллектор, которая собирает все значения, а потом высвобождает, типа:
local function collector(temp)
local storage = temp or {}
return function(...)
for i = 1, select('#', ...) do
local v = select(i, ...)
table.insert(storage, v)
end
end, storage
end
-- Usage:
local args, temp = collector()
args(1, 2, 3)
args(unpack{4, 5, 6})
args(7)
print(unpack(temp)) --> 1 2 3 4 5 6 7
Соответственно, функция select неплохо работает с множественными значениями.
Типа print(select(2, 'foo', 'bar')) --> bar
А '#' вместо числа - указывает количество аргументов:
print(select('#', 'foo', 'bar')) --> 2
А всё потому, что у луа есть скрытый тип данных touple.
Snusmumriken
Снусу стало грустно читать книжки на английском постоянно лазая в гугл-транслейтор, так что он накалякал консольный переводчик об гугл.
Даже goto есть!
Snusmumriken
На самом деле, можно извратиться и замутить что-то подобное для вырезанного текста с фреймбуфера: шорткатом выделяем область на экране, из неё каким-нибудь облачным (или предустановленным) OCR'ом вытаскивается текст, отправляется к переводчику и выводится чем-то message_box-подобным. Но это уже сверхкруть и теряется кроссплатформа (нужно и winapi для выдирания картинки с экрана, и что-то аналогичное линуксовое).
Чот скопился миллиард таких тулзов. Ну там, калькуляторы/искатели инфы для компутерных игрушек и не только.
mva
mva
да я и не просил :)
mva
это-то дело я обычно через таблицу config делаю :)