缓冲区写入的速度大于读取的速度 怎么解决?

时间:2021-02-12 21:00:29
ARM和DSP通过共享内存读取DSP的数据,数据大概每200ms(有可能小于200ms)更新一次。
现在打算读取共享内存区的数据并且保存。
本人采用方法是当前线程用20长度的链表存储,另外一个线程读取并发送到网络。
现在的问题是读取的速度小于写入的速度,经常出现缓冲区已经写满,但是读取还没有结束,导致数据被覆盖,丢失数据。
请问有没有好的方法解决???
万分感激!!!

15 个解决方案

#1


为什么规定链表的长度,你应该自动扩充链表啊

#2


引用 1 楼 bdmh 的回复:
为什么规定链表的长度,你应该自动扩充链表啊


恩 明白你的意思了  可是链表就这样无限的扩张吗,那不是会很浪费内存? 我用的环形链表。
本人新手,说的不专业的地方望见谅~

#3


那限定一下链表的长度,链表过长说明缓冲区已满写入失败,返回错误值或者阻塞等待写入。

#4


满了就写线程就sleep一段时间,如果你选1楼方案系统内存迟早被你用完

#5


那你读、写分别用不同的线程处理,缓冲区用各自的。。。

#6


1楼的是SB,不用理他,他的回答都是忽悠

#7


现在是写的速度大于读的速度
而且写的线程一定不能停 因为不允许丢失数据

#8


写入大于读取,基本无解。

如果非要解的话,可以用临时文件cache下。然后慢慢发送。

如果你的数据是24小时都有的话,那就完全没办法了,只能提高带宽

#9


引用 7 楼 jiangxu20072122 的回复:
现在是写的速度大于读的速度
而且写的线程一定不能停 因为不允许丢失数据

既然写不能停,只能想办法加快读的速度,否则必然要丢数据

#10


写不停,不能用可扩充存贮结构,似乎没有更好方法了

#11


引用 8 楼 kevin_qing 的回复:
写入大于读取,基本无解。

如果非要解的话,可以用临时文件cache下。然后慢慢发送。

如果你的数据是24小时都有的话,那就完全没办法了,只能提高带宽


你好   我读取完毕后直接发送到网络,估计主要是发送比较耗时

#12


我对C不太了解,我说下我得思路,说的不对勿拍!
在维持现状的情况下,加快读的速度几乎不可能,读写速度还要考虑硬件,要完全保证数据在读的时候不被覆盖,保险的做法,增加一个主缓存区(不共享),写的线程先写缓存区,当共享缓存区不被读时,在写共享缓存区;读的线程只从共享缓存中读数据

#13


程序是长时间运行了?如果是的话,那就没解了(再大的缓冲区早晚也会耗尽),只能提高网速(读的数度)。
每秒需要读多少数据?网速多少?

#14


adsl上传速度只有512kb,大约传送50kByte/s,如果需要24小时采集数据的话,只能更换更大带宽的接入方式

#15


阻塞写入。

#1


为什么规定链表的长度,你应该自动扩充链表啊

#2


引用 1 楼 bdmh 的回复:
为什么规定链表的长度,你应该自动扩充链表啊


恩 明白你的意思了  可是链表就这样无限的扩张吗,那不是会很浪费内存? 我用的环形链表。
本人新手,说的不专业的地方望见谅~

#3


那限定一下链表的长度,链表过长说明缓冲区已满写入失败,返回错误值或者阻塞等待写入。

#4


满了就写线程就sleep一段时间,如果你选1楼方案系统内存迟早被你用完

#5


那你读、写分别用不同的线程处理,缓冲区用各自的。。。

#6


1楼的是SB,不用理他,他的回答都是忽悠

#7


现在是写的速度大于读的速度
而且写的线程一定不能停 因为不允许丢失数据

#8


写入大于读取,基本无解。

如果非要解的话,可以用临时文件cache下。然后慢慢发送。

如果你的数据是24小时都有的话,那就完全没办法了,只能提高带宽

#9


引用 7 楼 jiangxu20072122 的回复:
现在是写的速度大于读的速度
而且写的线程一定不能停 因为不允许丢失数据

既然写不能停,只能想办法加快读的速度,否则必然要丢数据

#10


写不停,不能用可扩充存贮结构,似乎没有更好方法了

#11


引用 8 楼 kevin_qing 的回复:
写入大于读取,基本无解。

如果非要解的话,可以用临时文件cache下。然后慢慢发送。

如果你的数据是24小时都有的话,那就完全没办法了,只能提高带宽


你好   我读取完毕后直接发送到网络,估计主要是发送比较耗时

#12


我对C不太了解,我说下我得思路,说的不对勿拍!
在维持现状的情况下,加快读的速度几乎不可能,读写速度还要考虑硬件,要完全保证数据在读的时候不被覆盖,保险的做法,增加一个主缓存区(不共享),写的线程先写缓存区,当共享缓存区不被读时,在写共享缓存区;读的线程只从共享缓存中读数据

#13


程序是长时间运行了?如果是的话,那就没解了(再大的缓冲区早晚也会耗尽),只能提高网速(读的数度)。
每秒需要读多少数据?网速多少?

#14


adsl上传速度只有512kb,大约传送50kByte/s,如果需要24小时采集数据的话,只能更换更大带宽的接入方式

#15


阻塞写入。