Тема: Реальное удаление элементов таблицы - как?
Что происходит при удалении элемента таблицы Lua? Освобождается память?
Решил проверить, и наткнулся на очень неожиданно-грустный результат.
Скрипт для теста:
function get_t_count(t)
local c = 0
for n in pairs(t) do
c = c + 1
end
return c
end
t = {}
for i=1,10000 do
t[i] = i * 11
end
print (1, collectgarbage("count") , get_t_count(t), "<<-- создали, заполнили таблицу")
for i=1,8000 do
t[i] = nil
end
print (2, collectgarbage("count"), get_t_count(t), "<<-- присвоили nil для 80% элементов таблицы")
collectgarbage ()
print (3, collectgarbage("count") , get_t_count(t), "<<-- почистили мусор")
for i=1,9000 do
table.remove(t, 1)
end
print (4, collectgarbage("count") , get_t_count(t), "<<-- удалили 90% элементов таблицы")
collectgarbage ()
print (5, collectgarbage("count") , get_t_count(t), "<<-- почистили мусор")
t = {}
print (6, collectgarbage("count") , get_t_count(t), "<<-- переинициализировали таблицу {}")
collectgarbage ()
print (7, collectgarbage("count") , get_t_count(t), "<<-- почистили мусор")
Это скрипт выводит:
1 276.3134765625 10000 <<-- создали, заполнили таблицу
2 276.2890625 2000 <<-- присвоили nil для 80% элементов таблицы
3 276.1962890625 2000 <<-- почистили мусор
4 276.2880859375 2000 <<-- удалили 80% элементов таблицы
5 276.1962890625 2000 <<-- почистили мусор
6 276.3427734375 0 <<-- переинициализировали таблицу {}
7 20.1962890625 0 <<-- почистили мусор
Во втором столбце у нас - объем использованной Lua памяти.
Получается, что ни присвоение nil элементам таблицы, ни удаление элементов из таблицы через table.remove() не освобождает память! Даже если вызываем collectgarbage()
Помогает лишь полная переинициализация (удаление) таблицы через t = {}
И как же тогда быть? если в таблицу добавляем / удаляем элементы на протяжении работы скрипта - то занятая данными Lua память будет только расти и расти.
Есть ли способы реального освобождения памяти из-под элементов таблицы? гуглом ничего не сумел найти