荣小菜补钙记第16期:内存优化之数据值引用 同步更新于 WeChat:荣小菜在补钙 大家好,我是荣小菜,也可以叫我Richie,今天分享一种类似控件引用的传值方式——数据值引用传值。可以用来优化内存。 1. 背景 在labview中,好的编程习惯必然要多多利用子Vi。但是直接向子Vi中传递原数据往往会造成数据复制,数据量小时我们往往感觉不到,但当数据量突然变大时,就会出现内存已满错误。 2. Normal传值 我们姑且称这种直接传值方式为“Normal”。Demo演示如下,通过1个子Vi处理480MB的原始数据,最后竟然需要1400MB左右的内存,额外复制了2倍左右的冗余数据。此外,这种方式在程序运行结束后不会完全释放掉子Vi中所占内存,必须关闭LabVIEW或者应用程序才能被自动释放。按照这个内存损耗,只要连续运行2次,程序就会因内存达上限而报错。
当然,在子Vi结束时适当使用“请求释放内存”Vi也可以有效释放冗余内存,不过这属于主动释放了。 3. Queue传值 替代方案很容易想到,队列就是不错的选择,Demo演示如下,480 MB的数据生成后直接入队列,传递队列引用至子Vi中进行数据处理,而这样也正好几乎只需480MB内存就可以完成相同的数据处理。 4. Value Ref传值 这种传值方式和队列类似,直接给数据建立值引用(非属性节点那种引用),它位于LabVIEW“应用程序控制”->“内存控制”。Demo演示如下,使用“新建数据值引用”Vi和“删除数据值引用”Vi配合,给生成的480MB的数据直接建立引用,将该引用传递至子Vi进行数据处理。这样也几乎只需要480MB内存即可完成数据处理。注意,使用该方法要配合元素同址操作框一起。
这种方式我也是刚刚开始摸索,其优劣特点和使用方式都欠了解,也希望有大神帮忙科普解答一下。^_^
|