LINUX.ORG.RU

История изменений

Исправление LINUX-ORG-RU, (текущая версия) :

Это

SAtest[i][tostring(j)] = 1

И это

SAtest[i][tostring(j)] = true

Равнофигственно, булево значение займёт места в памяти +/- столько же сколько числовое, особенно с учётом того что ты ключи делаешь строками, а это значит гарантированно распихиваешь это в хештаблицу минуя любые оптимизации в отношении непрерывных данных.

SAtest[i][tostring(j)] = "Многомного текст, очень много"

Ситуаций может быть три в некотором приближении

  • Луа переиспользует одинаковые строки, а это значит что
    • Вместо 100000 строк будет 1 55 байтовая строка и 99999 указателей на неё
  • Луа не переиспользует одинаковые строки или именно эту
    • Или переиспользует, но не всегда и не везде.

Ты сделал 1 строку "Многомного текст, очень много" и 99999 указателей на неё. В Lua одинаковые строки переиспользуются, так экономится очень много памяти, но это не закон, мол всегда так, зависит от ситуации/реализации.

Вот потребление памяти в байтах на всех версиях Lua твоих тестов, по по порядку 1==а,2==b,3==c.

dron@gnu:~/Рабочий-стол/tests$ alua a.lua 
☺─────────── luajit ────────────☺
3193895
☺─────────── lua5.1 ────────────☺
5233543
☺─────────── lua5.2 ────────────☺
5221556
☺─────────── lua5.3 ────────────☺
4197922.0
☺─────────── lua5.4 ────────────☺
3171417.0
dron@gnu:~/Рабочий-стол/tests$ alua b.lua 
☺─────────── luajit ────────────☺
3193839
☺─────────── lua5.1 ────────────☺
5233559
☺─────────── lua5.2 ────────────☺
5221108
☺─────────── lua5.3 ────────────☺
4197938.0
☺─────────── lua5.4 ────────────☺
3171417.0
dron@gnu:~/Рабочий-стол/tests$ alua c.lua 
☺─────────── luajit ────────────☺
3194095
☺─────────── lua5.1 ────────────☺
5233716
☺─────────── lua5.2 ────────────☺
5221265
☺─────────── lua5.3 ────────────☺
4198095.0
☺─────────── lua5.4 ────────────☺
3171574.0
dron@gnu:~/Рабочий-стол/tests$

Проверяется память через print(collectgarbage("count")*1024), множим на 1024 для показа байт, а не килобайт.

Но рядом сохраняю логи чата и они жрут до мегабайта в сутки.

Тут ты делаешь пару строк и кучу их копий, в чате у тебя наверняка много уникальных строк.

А так, когда одинаково и/или непрерывно то есть некоторые оптимизации, во всех остальных случаях как бог руку положит учитывая всю динамику жизненного цикла lua программы. Если ты думаешь что некими хитрыми способами сможешь сэкономить мегабайты памяти, то я тебя расстрою, нет не сможешь там уже и так всё упаковано, так как о любой вещи о котрой ты помумаешь в рамках памяти Lua уже подумали, а любую оптимизацию которая была бы универсальна и своим добавлением не давала побочек уже сделали. Правило простое, однородные по типу данные имеющие непрерывную последовательность могут иметь оптимизацию в памяти, одинаковые данные типа string будут переиспользоваться без дублирования памяти, во всех остальных случаях все данные хранятся в хештаблице с её плюсами и минусами. Всё. Про userdata и подобное я молчу, отдельная тема.

Но, во первых, в любом случае относись к словам не как к истине, а так, со скепсисом =))) И ещё в частных случаях может случится так что у тебя потребление памяти упало, бывает это после прохода GC в случае когда ты замеряешь сначала до него, а потом после и бывает в случае когда у тебя данные меняются, меньше дырок, больше непрерывных таблиц, много одинаковых строк, больше числовых ключей, в замен дыркам с нилами, разрозненной «индексации» и смешанными типами в таблицах.

А мегабайт в день из за чата это 365 мегабайт всего чата за весь год, это не много. Можешь например хранить в памяти не более 10000 сообщений, а всё остальное сбрасывать на диск, организовав циклический буффер на стыке которого начало-конец сообщения сбрасываются на диск просто записывая новое сообщение в голову, а самое старое в файл и всё и не будет у тебя никаких проблем с памятью +/- фиксированное значение с учётом того что есть лимит на размер сообщения.

Исходная версия LINUX-ORG-RU, :

Это

SAtest[i][tostring(j)] = 1

И это

SAtest[i][tostring(j)] = true

Равнофигственно, булево значение займёт места в памяти +/- столько же сколько числовое, особенно с учётом того что ты ключи делаешь строками, а это значит гарантированно распихиваешь это в хештаблицу минуя любые оптимизации в отношении непрерывных данных.

SAtest[i][tostring(j)] = "Многомного текст, очень много"

Ситуаций может быть три в некотором приближении

  • Луа переиспользует одинаковые строки, а это значит что
    • Вместо 100000 строк будет 1 55 байтовая строка и 99999 указателей на неё
  • Луа не переиспользует одинаковые строки или именно эту
    • Или переиспользует, но не всегда и не везде.

Ты сделал 1 строку "Многомного текст, очень много" и 99999 указателей на неё. В Lua одинаковые строки переиспользуются, так экономится очень много памяти, но это не закон, мол всегда так, зависит от ситуации/реализации.

Вот потребление памяти в байтах на всех версиях Lua твоих тестов, по по порядку 1==а,2==b,3==c.

dron@gnu:~/Рабочий-стол/tests$ alua a.lua 
☺─────────── luajit ────────────☺
3193895
☺─────────── lua5.1 ────────────☺
5233543
☺─────────── lua5.2 ────────────☺
5221556
☺─────────── lua5.3 ────────────☺
4197922.0
☺─────────── lua5.4 ────────────☺
3171417.0
dron@gnu:~/Рабочий-стол/tests$ alua b.lua 
☺─────────── luajit ────────────☺
3193839
☺─────────── lua5.1 ────────────☺
5233559
☺─────────── lua5.2 ────────────☺
5221108
☺─────────── lua5.3 ────────────☺
4197938.0
☺─────────── lua5.4 ────────────☺
3171417.0
dron@gnu:~/Рабочий-стол/tests$ alua c.lua 
☺─────────── luajit ────────────☺
3194095
☺─────────── lua5.1 ────────────☺
5233716
☺─────────── lua5.2 ────────────☺
5221265
☺─────────── lua5.3 ────────────☺
4198095.0
☺─────────── lua5.4 ────────────☺
3171574.0
dron@gnu:~/Рабочий-стол/tests$

Проверяется память через print(collectgarbage("count")*1024), множим на 1024 для показа байт, а не килобайт.

Но рядом сохраняю логи чата и они жрут до мегабайта в сутки.

Тут ты делаешь пару строк и кучу их копий, в чате у тебя наверняка много уникальных строк.

А так, когда одинаково и/или непрерывно то есть некоторые оптимизации, во всех остальных случаях как бог руку положит учитывая всю динамику жизненного цикла lua программы. Если ты думаешь что некими хитрыми способами сможешь сэкономить мегабайты памяти, то я тебя расстрою, нет не сможешь там уже и так всё упаковано, так как о любой вещи о котрой ты помумаешь в рамках памяти Lua уже подумали, а любую оптимизацию которая была бы универсальна и своим добавлением не давала побочек уже сделали. Правило простое, однородные по типу данные имеющие непрерывную последовательность могут иметь оптимизацию в памяти, одинаковые данные типа string будут переиспользоваться без дублирования памяти, во всех остальных случаях все данные хранятся в хештаблице с её плюсами и минусами. Всё. Про userdata и подобное я молчу, отдельная тема.