我正在开发一个客户端,它将通过 TCP 接收 [EEG] 数据并将其写入环形缓冲区。我认为将缓冲区作为 ctypes 或 numpy 数组非常方便,因为可以为此类缓冲区的任何位置创建一个 numpy“视图”并读取/写入/处理数据,而无需任何复制操作。或者总体来说这是一个坏主意?
但是,我不知道如何以这种方式实现固定大小的循环缓冲区。假设我创建了一个在内存中连续的缓冲区对象。当到达缓冲区末尾时写入数据的最佳方式是什么?
一种可能的方法是当写指针到达缓冲区数组的末尾时从头开始覆盖(已经是旧的)字节。然而,在边界附近,在这种情况下,无法创建某些块(用于处理)的 numpy 视图(或者可以吗?),因为其中一些块仍然可以位于缓冲区数组的末尾,而另一个块已经位于缓冲区数组的末尾。它的开始。我读过不可能创建这样的圆形切片。怎么解决这个问题呢?
UPD:谢谢大家的回答。如果有人也面临同样的问题,here https://github.com/belevtsoff/rdaclient.py/blob/master/src/ringbuffer.py'是我得到的最终代码。
如果您需要 N 字节的窗口,请将缓冲区设置为 2*N 字节并将所有输入写入两个位置:i % N
and i % N + N
, where i
是一个字节计数器。这样缓冲区中始终有 N 个连续字节。
data = 'Data to buffer'
N = 4
buf = 2*N*['\00']
for i,c in enumerate(data):
j = i % N
buf[j] = c
buf[j+N] = c
if i >= N-1:
print ''.join(buf[j+1:j+N+1])
prints
Data
ata
ta t
a to
to
to b
o bu
buf
buff
uffe
ffer
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)