python - Python中命名的内存映射文件?

标签 python opencv

我正在使用 OpenCV在 Web 服务中处理一些视频数据。在调用 OpenCV 之前,视频已经加载到 bytearray 缓冲区,我想将其传递给 VideoCapture 对象:

# The following raises cv2.error because it can't convert '_io.BytesIO' to 'str' for 'filename'
cap = cv2.VideoCapture(buffer) 

不幸的是,VideoCapture() 需要一个字符串文件名,而不是缓冲区。现在,我将 bytearray 保存到一个临时文件,并将其名称传递给 VideoCapture()

问题:

  • 有没有办法在 Python 中创建 named 内存文件,这样我就可以安抚 OpenCV?
  • 或者,是否有另一个支持缓冲区的 OpenCV API?

最佳答案

注意:POSIX 特定的!由于您没有提供 OS 标签,我认为没关系。

根据this answer (和 this shm_overview manpage )系统上始终存在 /dev/shm 。这是一个 tmpfs 映射到 shared(不是 Python 进程内存)内存池中,如建议 here ,但好处是您不需要创建它,所以没有有趣的发明:

  • os.system("mount ...")
  • Popen(["mount", ...]) 包装器。

只需使用 tempfile.NamedTemporaryFile()像这样:

from tempfile import NamedTemporaryFile
with NamedTemporaryFile(dir="/dev/shm") as file:
    print(file.name)
    # /dev/shm/tmp2m86e0e0

然后您可以将其输入 OpenCV 的 API 包装器。或者,使用 pyfilesystem作为该设备/FS 的更广泛的包装器。

另外,multiprocessing.heap.Arena也使用它,所以如果它不起作用,就会出现更多的麻烦。对于 Windows check this implementation它使用 winapi.

对于/dev/shm的大小:

根据 sudo ipcs 判断如果您不使用套接字、管道或磁盘,这很可能是您希望在进程之间共享内容时使用的方式。

由于它是 POSIX,它应该可以在兼容 POSIX 的系统上运行,因此也可以在 MacOS( no ) 或 Solaris 上运行,但我无法尝试。

关于python - Python中命名的内存映射文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69328090/

相关文章:

python - Python 3.4 上的 Flask Bug?如果应用程序包含相对导入,则开发服务器无法运行

python - Django - 模型字段定义 unicode

python - 在单个单词字符串 PYTHON 中查找数字字符

c++ - OpenCV:获取相机分辨率 C++

c++ - OpenCV 与 uEye 相机

python - Pandas - 在多列中查找并迭代具有匹配值的行,并在另一列中乘以值

python - 对类实例列表进行排序 Python

python - 属性错误 : module 'cv2' has no attribute 'selectROI'

python - cv2.fastNlMeansDenoising()的怪异行为

android - NDK 编码中 OpenCV 的未定义引用错误过多