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

时间:2013-07-12 13:54:04

标签: c lua

我想使用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。谢谢大家!!

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

您可以将数据存储在string中,并使用字符串库和Lua BitOp

对其进行操作 如果可用的话,首选Lua5.2的内置bit32库。

答案 2 :(得分:0)

如果你想将1 MB读入内存,你最终不会得到250 kB ......

如果您将文件读入Lua字符串,最终会得到1 MB,因为Lua字符串只是8位干净字节。

之后,您可以使用struct library

来根据其结构处理数据