使python进程写入立即安排回写,而不被标记为脏

使python进程写入立即安排回写,而不被标记为脏,python,linux,numpy,linux-kernel,Python,Linux,Numpy,Linux Kernel,我们正在构建一个python框架,该框架通过cffi接口从framegrabber卡捕获数据。经过一些操作后,我们尝试以大约120MB/s的速率将原始图像(使用tofile方法的numpy阵列)写入磁盘。我们很清楚,are磁盘能够处理这种吞吐量 我们遇到的问题是丢弃帧,帧捕获器输出中通常会丢失整秒钟的数据。我们发现,当我们的Debian系统达到sysctl中设置的dirty_background_比率时,这些掉帧就发生了。系统正在调用刷新背景组,这会阻塞framegrabber并导致其跳过帧 毫

我们正在构建一个python框架,该框架通过cffi接口从framegrabber卡捕获数据。经过一些操作后,我们尝试以大约120MB/s的速率将原始图像(使用tofile方法的numpy阵列)写入磁盘。我们很清楚,are磁盘能够处理这种吞吐量

我们遇到的问题是丢弃帧,帧捕获器输出中通常会丢失整秒钟的数据。我们发现,当我们的Debian系统达到sysctl中设置的dirty_background_比率时,这些掉帧就发生了。系统正在调用刷新背景组,这会阻塞framegrabber并导致其跳过帧

毫不奇怪,将dirty_background_比率设置为0%成功地完全解决了问题(值得注意的是,即使是1%和2%这样的小数字也会导致约40%的帧丢失)

所以,我的问题是,有没有任何方法可以让这个python进程以这样一种方式进行写入,即立即安排写出来,完全绕过脏缓冲区


谢谢

所以我有一个办法

通过使用numpy memmap对象,您可以实例化一个与磁盘的一部分直接对应的数组。调用flush()方法或python的del会导致阵列与磁盘同步,完全绕过操作系统的缓冲区。我已使用此方法成功地以最大吞吐量将约280GB写入磁盘


我们将继续研究

另一个选项是获取os文件id并在其上调用os.fsync。这将立即安排写回