Lua中释放table占用内存的方法
table的大小是动态变化的。看如下代码:
tb = {1,2,3} --数组大小4,hash表大小1(不管hash表有没有存数据,它的大小最小为1)
tb[5] = 5
tb[100] = 100 --数组大小4,hash表大小2
因为后插入的两个数的key过于离散,所以它们被保存到hash表中。最终tb的大小为4+2=6。
这时我们对table进行删除操作:
tb[1] = nil
tb[2] = nil
tb[3] = nil
tb[5] = nil
tb[100] = nil
这时tb里面没有数据了,但tb的大小还是6,tb占用的内存空间并没有释放!
这里提供两种方式来释放tb所占的内存空间。
第一种:
将tb设为nil,然后等垃圾收集或强制执行一次垃圾收集(collectgarbage)。
第二种:
用一个之前没用过的key对tb的内容赋nil值。要找一个未使用过的key很简单,直接构造一个table当key就可以了,比如tb[{}]=nil。
第一种是正规的做法,第二种只是一种演示,不实用。
下面解释一下第二种方法为什么能释放table占用的内存空间。
只有两种情况会设置table的大小,一种是构造table的时候,一种是用一个新key向table插入一个值的时候。
前者不用解释,那是必须的。后者是为了提高table中array的利用率而进行的优化。
当向table插入一个新值时,lua会计算新值插入后整个table中array与hash的情况(有些值被设nil,有些值从hash移到array),
重新计算变化后的table,算出新的array与hash的大小,重新分配空间。
所以,尽管上面tb中的所有值都是nil,但由于没有向table插入一个新值,没有触发table的重新分配,所以空间并没有释放。
PS:为什么用一个老key没效果呢?这是因为老key对应的table空间还在,lua会直接使用老空间而不去计算新空间。
相关推荐
-
Lua中释放table占用内存的方法
table的大小是动态变化的.看如下代码: 复制代码 代码如下: tb = {1,2,3} --数组大小4,hash表大小1(不管hash表有没有存数据,它的大小最小为1) tb[5] = 5 tb[100] = 100 --数组大小4,hash表大小2 因为后插入的两个数的key过于离散,所以它们被保存到hash表中.最终tb的大小为4+2=6. 这时我们对table进行删除操作: 复制代码 代码如下: tb[1] = nil tb[2] = nil tb[3] = nil tb
-
Lua中设置table为只读属性的方法详解
项目中部分只读表易被人误改写,故决定在非线上环境里对这些表附加只读属性,方便在出现误改写的时候抛出lua错误,最终版代码如下: --[[------------------------------------------------------------------------------ -** 设置table只读 出现改写会抛出lua error -- 用法 local cfg_proxy = read_only(cfg) retur cfg_proxy -- 增加了防重置设置read_o
-
Lua中访问table里函数的方法示例
看例子代码: 复制代码 代码如下: do table_ = { a = 1, foo = function(i) return i end } print(table_.foo(1)) end
-
Lua中使用table实现的其它5种数据结构
lua中的table不是一种简单的数据结构,它可以作为其他数据结构的基础,如:数组,记录,链表,队列等都可以用它来表示. 1.数组 在lua中,table的索引可以有很多种表示方式.如果用整数来表示table的索引,即可用table来实现数组,在lua中索引通常都会从1开始. 复制代码 代码如下: --二维数组 n=10 m=10 arr={} for i=1,n do arr[i]={} for j=1,m do arr[i][j]=i*j end end f
-
Lua中的table浅析
Lua的table提供了Map的功能,实现了"关联数组",并且整数.字符串甚至nil都可以作为索引/key:table没有固定的大小. 基于table,可以表示普通数组.符号表.集合.记录.队列和其他数据结构. 而Lua也是通过table来解决模块(module).包(package)和对象(Object)的. 例如io.read表示使用"read"来索引table io. 在Lua中,table既不是值也不是"变量",而是对象,可以
-
Lua中的table学习笔记
table 在 Lua 里是一种重要的数据结构,它可以说是其他数据结构的基础,通常的数组.记录.线性表.队列.集合等数据结构都可以用 table 来表示,甚至连全局变量(_G).模块.元表(metatable)等这些重要的 Lua 元素都是 table 的结构.可以说,table 是一个强大而又神奇的东西. table 特性 在之前介绍 Lua 数据类型时,也说过了 table 的一些特性,简单列举如下(详情可查看之前的介绍): 1.table是一个"关联数组",数组的索引可以是数字
-
Lua中的元表(metatable)、元方法(metamethod)详解
终于到了在实际中经常要用到的内容了--元表与元方法. 在第一次看见这两样东西的时候,可能会觉得它很深奥,但其实很好理解,虽然实际上它可能真的很深奥.(小若:停!滚粗.) 1.知道为什么1 + 1 = 2吗? 为什么在Lua中,1+1会等于2呢?(小若:难道除了Lua,其他地方就不等于2了?) 为什么数字和数字相加是合法的,为什么table和table相加就会报错?大家有想过这些问题吗? 没错,规则,这一切都只是规则而已,Lua规定了数字之间可以进行加减乘除,而table之间则不可以. 这是因
-
Android 中对于图片的内存优化方法
1. 对图片本身进行操作 尽量不要使用 setImageBitmap.setImageResource. BitmapFactory.decodeResource 来设置一张大图,因为这些方法在完成 decode 后,最终都是通过 Java 层的 createBitmap 来完成的,需要消耗更多内存.因此,改用先通过 BitmapFactory.decodeStream 方法,创建出一个 bitmap,再将其设为 ImageView 的 source,decodeStream 最大的秘密在于其直
-
Lua中对table排序实例
lua中利用到的排序的基本上就是构造函数(table)了,为了便于和C区分开来,我俗称它为表单. 实例:(原理就是LUA集成的冒泡算法) 排序的一般姿势(对于只包含数字或者只包含字符串的简单数组) 复制代码 代码如下: table.sort(test) 扩展版 复制代码 代码如下: table.sort(test, function(a,b) return a.id<b.id end ) 实例一:值排序 1.数组模式 复制代码 代码如下: local test0 ={1,9,2,8,3,7,4,
-
Lua中使用table.concat连接大量字符串实例
最近2天都没有写新的文章了,主要是最近的内容没有特别有意思的. 之前的协同程序也暂时没有感觉到特别适用的地方,今天在看数据结构的部分,也是没多大意思(不代表没用). 但是突然发现了一个有意思的地方,那就是--连接大量字符串的时候,如何解决效率问题. 1.预备知识,在Lua中获取系统时间 为了直观地看到效率的差别,我们要计算一下代码的执行时间,所以,先来看看如何计算吧: 复制代码 代码如下: local startTime = os.clock(); for i = 1, 19900000
随机推荐
- python django 访问静态文件出现404或500错误
- JAVASCRIPT THIS详解 面向对象
- Java中的Calendar日历API用法完全解析
- php线性表的入栈与出栈实例分析
- 正则表达式:过滤<font>和</font>
- python实现360的字符显示界面
- C/C++数据对齐详细解析
- Android HandlerThread的使用及原理详解
- 如何使用Matrix对bitmap的旋转与镜像水平垂直翻转
- js实现网页随机切换背景图片的方法
- 理解javascript对象继承
- mongodb replica set 配置高性能多服务器详解
- SQL Server使用游标处理Tempdb究极竞争-DBA问题-程序员必知
- 实例讲解使用原生JavaScript处理AJAX请求的方法
- JavaScript 组件之旅(一)分析和设计
- HTML长文本截取含有HTML代码同样适用的两种方法
- 原生JS实现图片轮播与淡入效果的简单实例
- php和javascript之间变量的传递实现代码
- 浅谈 IPv6 基本技术原理和特点
- python多进程提取处理大量文本的关键词方法