LabVIEW TDMS连续写入内存增长
每次执行TDMS写入VI时,内存(RAM)使用量都会略有增加。这是内存泄漏吗,如何防止内存使用量增加?
解答
此问题有几种可能的解决方案:
TDMS文件的引用可能没有适当地关闭。对于每个打开TDMS函数,应使用TDMS关闭函数关闭引用。
如果使用标准TDMSAPI一次将数据写入多个通道,则必须以相同的顺序向这些通道写入相同数量的数据值。
在登录到TDMS文件之前,在channel上设置NI_MinimumBufferSize属性。设置此属性的示例参见附件MinimumBufferSizeExample.vi。这应该会降低内存增长的速度。
如果连续记录数据时间较长,NI建议将记录会话拆分为多个较短的会话。例如,可以通过每小时将数据记录到新的TDMS文件中,将数据写入多个TDMS文件。使用较短的日志记录会话有助于减少内存增长。
整个日志记录会话完成后,可以对每个TDMS文件进行碎片整理,然后将其合并为一个大文件。
将TDMS组件升级到最新版本可以缓解内存增长,但不能完全消除此问题。
使用标准的TDMS接口,TDMS开放式VI可打开TDMS文件进行读取和写入。将数据写入TDMS文件时,TDMSAPI会在内存中保留一个缓存,以便更轻松地随机访问文件中的数据。如果有一个使用TDMS持续将数据记录到磁盘的应用程序,则可能会出现内存泄漏。
当TDMS文件打开时,LabVIEW将在内存中创建一个索引结构,用于对文件的随机访问。内置的LabVIEW TDM流式处理API将始终创建此索引,即使只是编写。索引的大小不取决于文件的大小,而是取决于文件的碎片大小。如果存储相对较少的大数据块,则索引将非常小。如果继续向文件添加少量数据,它可能会变得非常大。对此的补救措施是NI_MinimumBufferSizes属性。可以在通道上设置此属性,以便在存储之前使LabVIEW缓冲器达到给定的值数。这样,来自多个调用“TDMS写入”的数据将计为文件中的一个数据块。其典型值为1000或10000。文件碎片和内存占用也相应减少,但LabVIEW会为缓冲器使用一些内存。
If all this fails, and you don't need reading access to the file whileyou're writing, you can also use the VIbased API for TDMS. This will not build the index structure Imentioned above, so there should be no memory increase at all. In this case, Irecommend to defragment the files before post-processing.
需要说明的是,上述的例程和文档,都是可以下载的,双击即可打开,其中压缩文件是可以采用粘贴复制的方式,拷贝到硬盘上。这不是图片,各位小伙伴看到后尝试一下,这个问题就不用加微信咨询了。有关LabVIEW编程、LabVIEW开发等相关项目问题,可联系我们。
楼主最近还看过