我正在使用 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
的大小:
- this是我发现的尺寸“规范”之一,
-
shm.h
,shm_add_rss_swap()
,newseg()
来自 Linux 源代码的可能包含更多细节
根据 sudo ipcs
判断如果您不使用套接字、管道或磁盘,这很可能是您希望在进程之间共享内容时使用的方式。
由于它是 POSIX,它应该可以在兼容 POSIX 的系统上运行,因此也可以在 MacOS( no ) 或 Solaris 上运行,但我无法尝试。
关于python - Python中命名的内存映射文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69328090/