Как в Lua определить размер объекта?

Есть ли способ в Lua определить (в памяти) размер объекта?

Я нашел статью на Gamepedia о размерах памяти объектов Lua, но она не является общей и точной.


person ner0x652    schedule 06.01.2016    source источник
comment
в какой таблице можно хранить когда? У вас есть определенная функция, которую вы вызываете, чтобы отправить таблицу в это хранилище? Что точно хранится в этом пуле? Строковая таблица? Сам объект таблицы lua C-side (как вы это сделаете, я не знаю).   -  person Etan Reisner    schedule 06.01.2016
comment
MP используется в качестве постоянного хранилища (энергонезависимой памяти) для хранения настроек или другой информации, поэтому таблица сохраняется при обновлении хранящейся в ней информации. Например, в системе клиент-сервер, если клиенту не удается отправить информацию на сервер, он должен сохранить информацию для отправки позже, даже после перезагрузки клиентской системы. Информация хранится в формате JSON.   -  person ner0x652    schedule 06.01.2016
comment
Это позволяет предоставить некоторую информацию, но не отвечает ни на один из моих реальных вопросов. Не могли бы вы внимательно прочитать мои вопросы и попробовать еще раз?   -  person Etan Reisner    schedule 06.01.2016
comment
Да, есть функция, которая толкает в МП. Когда? После изменения энергозависимой памяти (если энергозависимая память является очередью, то после удаления из очереди или постановки в очередь). Что именно хранится в этом пуле? см. графический пример в вопросе.   -  person ner0x652    schedule 07.01.2016
comment
Итак, вы храните строковую версию таблицы JSON в пуле? С пользовательской функцией? Итак, вопрос в том, каков размер строки JSON?   -  person Etan Reisner    schedule 07.01.2016
comment
Это совершенно не связано с размером объекта lua. Это размер строки (которая сохраняется в lua, когда ее получает ваша функция). Я предполагаю, что ваша функция использует lua_tostring (или аналогичный), чтобы получить фактические строковые данные из lua для их хранения?   -  person Etan Reisner    schedule 08.01.2016
comment
Я не согласен, что это совершенно не связано. Да, я хочу знать, сколько памяти занимает эта строка JSON, но это пока. Были похожие ситуации, когда мне нужно было узнать размер таблицы или функции.   -  person ner0x652    schedule 08.01.2016
comment
Но это не то, что вы здесь спросили. Ваш вопрос здесь был совершенно не связан с этим. Это тоже разумный вопрос, но не то, что вы задавали здесь. Если вы хотите принять любой из представленных ответов, я бы предложил переписать вопрос, чтобы полностью удалить строку JSON и пул памяти из вопроса, поскольку они не связаны.   -  person Etan Reisner    schedule 08.01.2016


Ответы (2)


Я бы дал то же объяснение, что и @NicolBolas, но разные ответы на вопросы.

Есть ли способ в Lua определить (в памяти) размер объекта?

Да, но для этого вам может понадобиться внешний модуль. См. мой предыдущий ответ и, в частности, lua-getsize.

Есть ли способ в Lua определить, превышает ли сохраняемая таблица размер MP?

Если вы знаете размер таблицы с элементами X, вы, вероятно, можете экстраполировать на таблицу с элементами Y примерно того же содержания, но вы не сможете ограничить выделение до определенного размера, если вы не используете свой собственный распределитель, который имеет это логика.

person Paul Kulchenko    schedule 06.01.2016

Есть ли способ в Lua определить, превышает ли сохраняемая таблица размер MP?

No.

Есть ли способ в Lua определить (в памяти) размер объекта?

No.

Lua не отвечает за такие вещи, как ограничение памяти и так далее. Это должно быть обработано из кода C, который создает и управляет состоянием Lua. Так что, если у вас есть ограничение в 16 МБ, то это нужно встроить в lua_State при вызове lua_newstate. Вы передаете ему функцию распределения, которая должна отслеживать все такие распределения. Это также будет выделять память из пула памяти, а не из кучи.

Конечно, распределитель не может точно сказать, почему происходит выделение. Таким образом, нет способа ограничить только эту конкретную таблицу размером 16 МБ, если вы хотите, чтобы состояние Lua также выполняло другие действия.

Если у вас есть такие специфические потребности в памяти только для этой одной таблицы, вам, вероятно, потребуется выделить и сохранить ее в C/C++, а затем использовать интерфейс Lua, чтобы открыть ее в Lua для чтения/манипулирования.

person Nicol Bolas    schedule 06.01.2016