我想使用Lua将大型二进制文件(大小为1mb)读入内存。目标设备是移动的,因此我非常希望最小化内存占用。
从网上快速看看,似乎Lua tabels将为每个连续的整数索引(键)使用16B加上存储值的空间,因为我存储二进制数据希望只使用2位但是我只想说1字节。
对于1e6记录,将是1e6 * 17 = ~17mB - 这是巨大的!
从我的简短阅读中,似乎我可以使用userdata
在C中实现我想要的任何东西。我之前没有使用过C,但它似乎会使用
1b * 1e6 = 125kB
我应该这样做还是我有一些非常错误的东西/是否有更简单的方法来做到这一点。
非常欢迎任何建议,甚至是蹩脚计算的名字。)
编辑:下面有一些有趣的答案关于将数据存储在字符串中(谢谢!)和使用按位操作。我刚刚在PIL书(第3版pg293)中找到了一个例子,它比较了C中存储的布尔数组,因此他们使用了3%的内存。虽然这很酷且很有用但对我来说可能有点过头了,因为下面的解决方案表明我可以适应1MB,这对我来说很好。
编辑:遇到this C blob impl
编辑:解决方案 - 我按照建议将文件内容读入字符串,因为我使用5.1必须使用第三方位操作 - 我使用了纯粹的Lua实现LuaBit。谢谢大家!!
答案 0 :(得分:7)
你可以在Lua字符串中存储一个大blob,它可以处理任何二进制数据。现在的问题是你想要对数据做什么。无论如何,您可以使用string.byte提取任何单个字节,并使用Lua的bit32库来获取位。 (对于Lua 5.1及更早版本,您要么必须编写自己的C例程,要么使用第三方软件包。)
答案 1 :(得分:3)
您可以将数据存储在string
中,并使用字符串库和Lua BitOp
答案 2 :(得分:0)
如果你想将1 MB读入内存,你最终不会得到250 kB ......
如果您将文件读入Lua字符串,最终会得到1 MB,因为Lua字符串只是8位干净字节。
之后,您可以使用struct library。
来根据其结构处理数据