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

时间:2017-02-28 23:15:41

标签: python linux numpy linux-kernel

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

我们遇到的问题是丢帧,通常整帧数据完全从帧抓取器输出中丢失。我们发现当我们的Debian系统遇到sysctl中设置的dirty_background_ratio时,这些framedrops正在发生。该系统正在调用刷新背景组,它会阻塞帧抓取器并使其跳过帧。

毫不奇怪,将dirty_background_ratio设置为0%可以完全摆脱问题(值得注意的是,即使像1%和2%这样的小数字仍会导致约40%的帧丢失)

所以,我的问题是,有没有办法让这个python进程以这样的方式编写,以便立即进行写操作,完全绕过脏缓冲区?

由于

2 个答案:

答案 0 :(得分:0)

所以,这是我设法做到的一种方式。

通过使用numpy memmap对象,您可以实例化一个与磁盘的一部分直接对应的数组。调用方法flush()或python&#del; del会导致数组同步到磁盘,完全绕过OS的缓冲区。我已经使用这种方法以最大吞吐量成功地将~280GB写入磁盘。

将继续研究。

答案 1 :(得分:0)

另一个选择是获取os文件ID并在其上调用os.fsync。这将立即计划将其写回。