问题:
我用WHILE循环编写了一个8通道模拟量采集的程序,每秒钟采一次数据,每小时自动保存一次数据到EXCEL文件,但采了几个小时后,系统资源占用很大,变成几秒钟采一次了,CPU一直是100%占用的,速度越来越慢,什么原因啊,请教?
方法
创建两个循环,一个作采集一个作写数据库,中间采用变量传递,访问数据库的时间间隔设的小一点了,不然你那么多数据在内存中怎么可以哪。
使用缓冲文件系统这样做随着数据量的增多,系统资源消耗肯定也会增加。使用非缓冲文件系统就可以很好地解决这个问题。
先设一个缓冲区,将采集来的数据暂时存到缓冲区中,待到缓冲区满时就把其中的数据写入磁盘。缓冲区可以设大一点这样可以减少操作磁盘的次数。另外,最好编写两个线程,一个线程采集数据到缓冲区,另一个线程
检查缓冲区是否满,并在满的时候,将数据追加到数据文件中。
如果是循环采集,随着时间的推移,内存中波形数组肯定越来越大,势必造成内存不足;如果你只是把数据保存了,没有清空系统的接收的buffer,内存用量并不能下降呀。可以建一个缓冲堆栈(FIFO),来一个接收一个,再开一个存储线程,给定多少时间存储一次,这样大部分时间系统只有采集线程在工作,只是在存储的那很短的时间,分配一些时间片给存储线程,就跟word的自动保存一样,对采集线程没有多大影响,数据也不会丢失。我最近也正在做这方面的工作,这是我根据前辈的指导和自己的一些经验小结,跟大家共同探讨!
“固定缓冲区”法中缓冲区的容量是固定,当缓冲区满且数据存储后,当然要刷新缓冲区。由于采样频率和采样点数不一定保持不变,所以它单位时间内写磁盘的次数也是不一定的;
“时间片”法中单位时间写磁盘的次数是一定的,但数据缓冲区的容量是可伸缩的。
我在WHILE循环中,采用中间变量将采集到的数据存放到一个数组中,在另外一个循环中,每过一个小时保存一下数据,但是保存的数据是累加起来的,一次比一次多,中间变量中的数据并没有被释放掉。
如果采用缓冲堆栈(FIFO),势必要将两个循环合并为一个循环中,保存时会不会丢失少量数据呢? 具体如何操作啊?
用户420235 2015-10-27 19:18
用户288436 2010-6-13 10:06