我正在开发一个客户端,它将通过tcp接收[EEG]数据并将其写入环形缓冲区。我认为将缓冲区作为ctypes或numpy数组可能非常方便,因为可以创建numpy“视图”到这种缓冲区的任何位置,并读取/写入/处理数据而无需进行任何复制操作。但是,总体上这是否是一个不好的想法?
然而,我不知道如何以这种方式实现固定大小的循环缓冲区。假设我已经创建了一个在内存中连续的缓冲区对象。当写指针到达缓冲区数组的末尾时,最佳的写入数据方式是什么?
一种可能的方法是当写指针到达缓冲区数组的末尾时,从开始处开始覆盖(已经旧的)字节。然而,在边界附近,由于某些块的numpy视图(用于处理)仍然可以位于缓冲区数组的末尾,而另一个块已经位于其开始处,因此在这种情况下可能无法创建。我已经阅读过无法创建这样的循环切片。如何解决这个问题?
更新:感谢大家的答案。如果有人也面临同样的问题,则这里是我得到的最终代码。
然而,我不知道如何以这种方式实现固定大小的循环缓冲区。假设我已经创建了一个在内存中连续的缓冲区对象。当写指针到达缓冲区数组的末尾时,最佳的写入数据方式是什么?
一种可能的方法是当写指针到达缓冲区数组的末尾时,从开始处开始覆盖(已经旧的)字节。然而,在边界附近,由于某些块的numpy视图(用于处理)仍然可以位于缓冲区数组的末尾,而另一个块已经位于其开始处,因此在这种情况下可能无法创建。我已经阅读过无法创建这样的循环切片。如何解决这个问题?
更新:感谢大家的答案。如果有人也面临同样的问题,则这里是我得到的最终代码。
numpy_ringbuffer
包 来解决这个问题,它提供了对底层缓冲区的deque
类似接口。 - Eric