写了个需要长时间运行的程序,没做内存优化,于是,程序内存、我、老大、客户都炸了。
目录
一 查看内存使用情况
1 未运行的程序所占内存
文件-VI属性-内存使用
2 查看运行中的VI所用时间及内存使用情况
工具-性能分析-性能和内存
3 显示所分配缓冲区
工具-性能分析-显示缓冲区分配
一个黑点表示有一个缓冲区分配
二 内存优化
1 如非必要,不要将VI属性设置为重入
做了这么个子VI
主VI
设置为非重入然后运行一下
结果是这样的
设置为共享副本重入执行的时候
结果是这样的
设置为预先分副本重入执行的时候
结果是这样的
共享副本重入执行,当框图内多个相同子vi时,执行时系统会根据是否需要同时执行来创建独立的内存空间,如果任意时刻仅有一个vi在运行,则系统就只会创建一个独立的内存空间,若多个同时运行时,同时系统就会创建多个独立的内存空间。
设置为此模式时尽量不要有没初始化的东西。
预先分副本重入执行在框图内有多个相同子VI的时候,给每个子VI分配一个单独的内存空间。
2 使用“请求释放内存”函数
3 使用移位寄存器或元素同址操作结构
此程序先构造数组再对其中几个特定位置的值进行替换,每一步操作都新开一块缓存保存运算结果副本。
加了个移位寄存器之后,成功去掉了不必要的数据副本
4 尽量避免开启子VI前面板
非得开启的时候,如果子VI前面板上有数据量大的控件(表格、图表等等),在关闭的时候记得释放。
例如我这个,一个表格,从程序开启到运行结束,最后要显示的数据大概3M,然后它再生成个波形图,而这个子VI又同时运行22个,于是它就在查看数据的时候内存不足,挂了。
解决很简单,在退出查看的时候把数组和波形图置空,完活。
5 可以将复杂VI拆分成几个子VI
这个操作并不会增加额外的数据空间和代码,而且在子VI运行结束的时候,可以及时收回子VI数据空间。
6 避免内存泄漏
LabVIEW是可以自动管理内存的,适当的时候分配或回收资源。一般就反复打开某资源之后没关闭会出现内存泄漏。
就打开文件后,就算不连“关闭文件”这个函数程序也不报错,但是就是会内存泄漏