CyberTrader, спасибо за подробный и обстоятельно оформленное сообщение.
CyberTrader пишет:Ну ладно, с многомерными массивами не работает...
Скажем так: для обхода многомерных конструкций используется тупая рекурсия, которая, как известно, очень любит потреблять стек (стек процессора, не Lua). И при глубоких вложенностях или большом количестве элементов стека может не хватать. На эту проблему уже жаловались, но тогда не был приведён пример, вы привели пример - это здорово, есть с чем разбираться, спасибо.
CyberTrader пишет:Проверим на одномерном:
По поводу полученных результатов. Положим что диспетчер задач показывает именно реальное наше потребление памяти, что не совсем корректно, но пусть в первом приближении это так.
1) Запускаем QUIK, смотрим в диспетчере задач занимаемую процессом info.exe
Память: 32,0 Мб
2) Запускаем две копии скрипта 1
Память: 64,4 Мб
Отсюда можно сказать, что 2 наши большие таблицы занимают грубо 32 Мб в памяти Lua, т.е. по 16 Мб на таблицу.
1) Перезапускаем QUIK
Память: 32,1 Мб
2) Запускаем скрипт 2
Память: 93,4 Мб. И это без обращения к переменной "пространства имен" из 3-го скрипта.
Немного не понял при чем тут "пространство имен", но грубо картинка такая, что мы
а) создали 1 таблицу (это 16 Мб из предыдущего эксперимента)
б) подгрузили библиотеку
в) поместили её в буферное хранилище таблицу.
В сумме пункты б) и в) заняли у нас грубо 93-32-16= 45 Мб.
Ну например буферное универсальное хранилище не очень оптимально, что требует такого повышенного расхода памяти в сравнении с Lua.
3) При получении значения сохранённой переменной из 3-го скрипта память, занимаемая процессом info.exe возрастает до 125,3 Мб.
Т.е. прирост у нас грубо 125-93=32 Мб
Из них 16 Мб - собственно копия таблицы Lua в вирт. машине скрипта 3, и 16 Мб - "накладных расходов", откуда они - хороший вопрос.
Так я понимаю цифры вашего эксперимента.
CyberTrader пишет:Как видно из результатов тестов, под переменную в Name Space дополнительно резервируется память, причём в большем объёме, чем требуется для той же переменной без использования Name Space.
А вот эту вашу фразу я решительно не могу понять.
Т.е. если убрать вот эту строку
stv.UseNameSpace("testNS")
то расход памяти уменьшится? или я не понимаю о каком Name Space вы говорите.