Я хочу прочитать большой двоичный файл (размером 1 МБ) в память, используя Lua. Целевое устройство мобильное, поэтому я очень хочу минимизировать использование памяти.
Из беглого взгляда онлайн кажется, что таблицы Lua будут использовать 16B для каждого последовательного целочисленного индекса (ключа) плюс пространство для хранения значения, которое, как я храню двоичные данные, будет, вероятно, использовать только 2 бита, но давайте просто скажем 1 байт.
Для 1e6 записей это будет 1e6 * 17 = ~ 17MB - что огромно!
Из моего краткого чтения кажется, что я могу использовать userdata
для реализации всего, что я хочу в C. Я раньше не использовал C, но кажется, что он будет использовать
1b * 1e6 = 125 кБ
Должен ли я сделать это или у меня что-то очень неправильно/есть более простой способ сделать это.
Любые советы или даже обзывания для дерьмовых расчетов очень приветствуются :)
РЕДАКТИРОВАТЬ: Ниже приведены некоторые интересные ответы о хранении данных в строке (спасибо!) И использовании побитовых операций. Я только что натолкнулся на пример из книги PIL (3-е издание, стр. 293), в котором сравнивается хранение массивов логических значений в C, поэтому они используют 3% памяти. Хотя это круто и полезно, для меня это может быть излишним, так как приведенные ниже решения показывают, что я могу уместиться в 1 МБ, что хорошо для меня.
РЕДАКТИРОВАТЬ: наткнулся на эту каплю C Impl
РЕДАКТИРОВАТЬ: Решение - Я прочитал содержимое файла в String, как было предложено, и, поскольку я, используя 5.1, должен был использовать сторонний бит op lib - я пошел с чистой реализацией Lua LuaBit. Спасибо всем!!