10

我想使用 Lua 将一个大的二进制文件(大小为 1MB)读入内存。目标设备是移动的,所以我非常想尽量减少内存占用。

从网上的快速浏览看来,Lua 表将使用 16B 用于每个顺序整数索引(键)加上存储值的空间,因为我存储二进制数据希望只使用 2 位,但我们只说 1 字节。

对于 1e6 记录,它将是 1e6*17 =~ 17MB - 这是巨大的!

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

1b * 1e6 = 125kB

我应该这样做还是我遇到了一些非常错误的事情/有没有更简单的方法可以做到这一点。

非常欢迎任何关于蹩脚计算的建议甚至是谩骂:)

编辑:下面有一些关于将数据存储在字符串中(谢谢!)和使用按位运算的有趣答案。我刚刚在 PIL 书(第 3 版 pg293)中遇到了一个示例,该示例比较了在 C 中存储布尔值数组,因此它们使用了 3% 的内存。虽然这很酷而且很有用,但对我来说可能有点过头了,因为下面的解决方案建议我可以放入 1MB,这对我来说很好。

编辑:遇到这个 C blob impl

编辑:解决方案 - 我按照建议将文件内容读入 String ,因为我使用 5.1 必须使用 3rd 方位操作库 - 我使用纯 Lua 实现LuaBit。感谢大家!!

4

3 回答 3

8

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

于 2013-07-12T13:59:45.810 回答
3

您可以将数据存储在 a 中string并使用字符串库和Lua BitOp 对其进行操作

如果可用,首选 Lua5.2 的内置 bit32 库。

于 2013-07-12T14:02:54.827 回答
1

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

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

之后,您可以使用struct library根据其结构处理数据。

于 2013-07-12T14:05:51.603 回答