【发布时间】:2018-06-02 17:36:42
【问题描述】:
我正在尝试在 Lua 中构建 Sieve of Eratosthenes,我尝试了几件事,但我发现自己遇到了以下问题: Lua 的表对于这种情况来说太小了。如果我只想创建一个包含所有数字的表格(请参见下面的示例),那么即使只有数字的 1/8(...),表格也太“小”了(我承认这个数字很大)......
max = 600851475143
numbers = {}
for i=1, max do
table.insert(numbers, i)
end
如果我在我的 Windows 机器上执行此脚本,则会出现一条错误消息:C:\Program Files (x86)\Lua\5.1\lua.exe: not enough memory。在我的 Linux 机器上运行 Lua 5.3 时,我也尝试过,错误只是 killed。所以很明显lua无法处理条目的数量。
我真的不知道是否不可能在 lua 表中存储这么多条目,或者有一个简单的解决方案(也尝试使用长字符串......)? Lua 表中最大的条目数量到底是多少?
更新:是否可以手动为表分配更多内存?
更新2(第二个问题的解决方案):第二个问题很简单,我只是通过运行每个数字直到程序中断来测试它:33.554.432 (2^25) 个条目适合我的 12 GB RAM 系统上的一个一维表。为什么是 2^25?因为每个数字 64 位 * 2^25 = 2147483648 位正好是 2 GB。这似乎是 Lua for Windows 32 位编译器的标准内存分配大小。
附:您可能已经注意到这个数字来自欧拉计划问题 3。是的,我正在努力实现这一点。请不要给出具体的提示(..)。谢谢你:)
【问题讨论】:
-
由
NLua 值(甚至布尔值)组成的长数组在 Lua 中至少占用16*N字节的内存。 -
就像我在我的回答和@Piglet 在他的回答中解释的那样,很可能有 ``` 64*N``` 位(:8 --> 16 字节)的内存被占用。问题是如何解决问题...
-
你们俩都错了。 Lua 为数组的一个元素(128 位)花费 16 个字节。 Lua 太浪费了 :-)
-
@EgorSkriptunoff 你能告诉我如何更有效地执行此操作或如何手动为表分配内存吗?
-
您应该找到另一种解决方案(使用较短的表格)。你要求不要给你提示:-)