我想使用Lua读取一个大的二进制文件(大小为1mb)到内存中.目标设备是移动的,所以我非常希望最小化内存占用.
从一个快速的在线看,似乎Lua tabels将使用16B为每个顺序的整数索引(key)加上存储值的空间,我正在存储二进制数据,希望只能使用2位,但只能说1个字节.
对于1e6记录,将是1e6 * 17 =〜17mB – 这是巨大的!
从我的简短的阅读看来,我可以使用userdata来实现我想要的任何东西.我以前没有使用过C,但它似乎会使用
1b * 1e6 = 125kB
我这样做还是让我有一些非常错误的事情/是否有更简单的方法来做到这一点.
任何建议,甚至名字叫笨重的计算非常欢迎:)
编辑:下面有关将数据存储在字符串中的一些有趣的答案(谢谢!)和使用按位操作.我刚刚在PIL书(第3版pg293)中比较了一个例子,比较了C中存储的布尔数组,所以他们使用了3%的内存.虽然这是很酷和有用的,可能是对我来说太过分了,因为下面的解决方案表明我可以适应1MB这对我来说很好.
编辑:跨越this C blob impl
编辑:解决方案 – 我按照建议将文件内容读入字符串,并且使用5.1使用第三方位操作的Im – 我用纯Lua实现LuaBit.感谢大家!
解决方法
您可以在Lua字符串中存储一个大blob,它将与任何二进制数据一起使用.现在的问题是你对数据的处理方式.无论如何,您可以使用
string.byte提取任何单个字节,并使用Lua的
bit32库来缩减位. (对于Lua 5.1及以上版本,您必须编写自己的C程序,或使用第三方程序包.)