在Lua中创建大型数组的最佳方法

Dor*_*ori 10 c lua bit

我想使用Lua将大型二进制文件(大小为1mb)读入内存.目标设备是移动的,所以我非常希望最小化内存占用.

从网上快速看看,似乎Lua tabels将为每个连续整数索引(键)使用16B加上存储该值的空间,因为我存储二进制数据希望只使用2位但只能说1个字节.

1e6记录将是1e6*17 = ~17mB - 这是巨大的!

从我的简短阅读看来,我似乎可以userdata用来实现我想要的任何东西.我之前没有使用过C但看起来它会用到

1b*1e6 = 125kB

我应该这样做,还是我有一些非常错误/有更简单的方法来做到这一点.

任何建议甚至是蹩脚计算的名字都非常欢迎:)

编辑:下面有一些有趣的答案关于将数据存储在字符串中(谢谢!)和使用按位操作.我刚刚在PIL书(第3版pg293)中找到了一个例子,它比较了C中存储的布尔数组,因此他们使用了3%的内存.虽然这很酷且有用,但对我来说可能有点过分,因为下面的解决方案表明我可以装入1MB,这对我来说很好.

编辑:遇到这个C blob impl

编辑:解决方案 - 我按照建议将文件内容读入字符串,因为我使用5.1必须使用第三方位操作 - 我使用纯Lua实现LuaBit.感谢大家!!

che*_*che 7

你可以在Lua字符串中存储一个大blob,它可以处理任何二进制数据.现在的问题是你想要对数据做什么.无论如何,您可以使用string.byte来提取任何单个字节,并使用Lua的bit32库来获取位.(对于Lua 5.1及更早版本,您要么必须编写自己的C例程,要么使用第三方软件包.)

  • 我会查看手册而不是谷歌搜索:-)使用`file:read'*a'`来读取完整的文件或`file:read(n)`来读取`n`字节. (4认同)