有没有一种简单的方法来获取Lua表的内存使用情况?

9

我想知道Lua表格使用了多少内存,但不想通过迭代表格内容并计算使用量来确定。是否有Lua 5.1函数或第三方库可以帮助解决这个问题。

4个回答

11

您可以通过在代码的适当位置(例如,在插入操作之前和之后)调用collectgarbage("count")gcinfo()来监视Lua的内存使用情况。没有简单的方法来获取表的大小。


7
请勿将Lua全大写。它不是一个缩写词。http://www.lua.org/about.html#name - Alexander Gladysh
我会试一试 - 这可能会给我足够的信息来做决定。如果不行,我会考虑亚历山大和詹姆斯的建议。谢谢! - user295625

2

这个任务没有对应的功能。你为什么想要做这个呢?你想要达到什么目的?


我正在使用一个消耗大量内存的Lua应用程序,最终导致可用内存被耗尽。坦率地说,这是一个设计缺陷,我可以在源代码中看到问题区域。需要重新编写/重新思考,但是我不能在一个月内开始。在此期间,我正在寻找快速解决方案,以使客户再次运行。我想更详细地分解内存使用情况,以帮助我决定现在要更改/规避哪些部分。 - user295625
你尝试过调整垃圾收集器或使用紧急垃圾收集补丁吗?http://lua-users.org/wiki/EmergencyGarbageCollector它非常稳定,对于更嵌入式的情况(如微控制器上的64k SRAM)也非常有用。Lua 5.2预发布版还具有EGC,这不是上面提到的补丁,但应该提供类似的功能。你是否实际上使用了所有可用内存中仍在使用的对象?正如您可能在Lua列表链接中找到的其他回复中所指出的那样,Lua允许您将任何东西定义为内存分配器。 - James Snyder
这对于帮助检测Lua脚本中的泄漏存在将会很有用。 - david van brink

1

第二个链接又挂了,难过。 - Tosfera

1
你可以像这样做:
local pre = collectgarbage("count")
local table = {1, 2, 3, 4, 5}
local aft = collectgarbage("count")

local probablyTableSize = aft - pre
print(probablyTableSize)

请注意,我不确定在有很多后台操作的情况下,这是否准确。当我们声明table变量时,可能会添加/删除更多内存。
这可能是多余的,但在这种情况下,您可以尝试多次获取平均值或中位数,看看会发生什么。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接