Лучший способ создания больших бит-массивов в Lua

Я хочу прочитать большой двоичный файл (размером 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. Спасибо всем!!

Ответ 1

Вы можете сохранить большой блок в строке Lua, он будет работать с любыми двоичными данными. Теперь вопрос заключается в том, что вы хотите делать с данными. В любом случае вы можете использовать string.byte для извлечения любого отдельного байта и использовать Lua bit32, чтобы перейти к битам. (Для Lua 5.1 и старше вам придется либо написать свои собственные подпрограммы C, либо использовать сторонний пакет.)

Ответ 2

Вы можете сохранить данные в string и манипулировать им с помощью библиотеки строк и Lua BitOp

Lua5.2 встроенная библиотека бит32 предпочтительнее, если она доступна.

Ответ 3

Если вы хотите прочитать 1 МБ в памяти, вы не получите 250 кБ...

Если вы прочитаете файл в строке Lua, вы получите 1 МБ, поскольку строки Lua - это всего лишь 8-битные чистые байты.

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