带有numpy/ctypes的环形缓冲区

dmy*_*tro 6 python ctypes numpy circular-buffer

我正在开发一个客户端,它将通过tcp接收[EEG]数据并将其写入环形缓冲区.我认为将缓冲区作为ctypes或numpy数组非常方便,因为它可以为这样的缓冲区的任何位置创建一个numpy"视图",并且可以读取/写入/处理数据而无需任何复制操作.或者一般来说这是一个坏主意?

但是,我没有看到如何以这种方式实现固定大小的循环缓冲区.假设我创建了一个在内存中连续的缓冲区对象.达到缓冲区末尾时写入数据的最佳方法是什么?

一种可能的方法是在写指针到达缓冲区数组的末尾时开始覆盖(已经过时的)字节.然而,在边界附近,在这种情况下,某些块(用于处理)的numpy视图无法创建(或者可以吗?),因为其中一些仍然可以位于缓冲区数组的末尾,而另一个已经在它的开始.我读过它是不可能创建这样的圆形切片.怎么解决这个?

UPD:谢谢大家的答案.如果有人也面临同样的问题,是我得到的最终代码.

Jan*_*ila 6

如果您需要一个 N 字节的窗口,请将缓冲区设为 2*N 字节并将所有输入写入两个位置:i % Ni % N + N,其中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]) 
Run Code Online (Sandbox Code Playgroud)

印刷

Data
ata 
ta t
a to
 to 
to b
o bu
 buf
buff
uffe
ffer
Run Code Online (Sandbox Code Playgroud)