我们正在构建一个python框架,通过cffi接口从framegrabber卡中捕获数据。经过一些操作后,我们尝试以大约120 MB / s的速率将RAW图像(使用tofile方法的numpy数组)写入磁盘。我们清楚知道磁盘能够处理这种吞吐量。
我们遇到的问题是丢帧,通常整帧数据完全从帧抓取器输出中丢失。我们发现当我们的Debian系统遇到sysctl中设置的dirty_background_ratio时,这些framedrops正在发生。该系统正在调用刷新背景组,它会阻塞帧抓取器并使其跳过帧。
毫不奇怪,将dirty_background_ratio设置为0%可以完全摆脱问题(值得注意的是,即使像1%和2%这样的小数字仍会导致约40%的帧丢失)
所以,我的问题是,有没有办法让这个python进程以这样的方式编写,以便立即进行写操作,完全绕过脏缓冲区?
由于
答案 0 :(得分:0)
所以,这是我设法做到的一种方式。
通过使用numpy memmap对象,您可以实例化一个与磁盘的一部分直接对应的数组。调用方法flush()或python&#del; del会导致数组同步到磁盘,完全绕过OS的缓冲区。我已经使用这种方法以最大吞吐量成功地将~280GB写入磁盘。
将继续研究。
答案 1 :(得分:0)
另一个选择是获取os文件ID并在其上调用os.fsync。这将立即计划将其写回。