我在带摄像头的 Raspberry Pi 上运行 Python v3.5 脚本。该程序涉及从视频流中录制视频picamera
并从视频流中获取样本帧以执行操作。有时,处理字节缓冲区需要很长时间(20+ 秒)。包含问题区域的代码的简化版本是:
import io
import picamera
camera = picamera.PiCamera()
camera.start_recording("/path/to/file.h264")
cnt = 0
while True:
if cnt > 30:
stream = io.BytesIO()
camera.capture(stream, use_video_port=True, resize=(1920, 1080), format='rgba')
cnt = 0
else:
cnt += 1
一段时间后,打开字节流所需的时间变得疯狂。在我最近一次运行中,一个实例耗时超过 48 秒! 该图显示了每个周期打开字节流的时间图。 我对代码有问题的区域中的每一行进行了时序测试,我可以确认它是stream = io.BytesIO()
导致延迟的行。
当我在此任务期间使用 监控 Raspberry Pi 的 CPU 和内存时psutils
,我没有观察到明显的问题。CPU 使用率为 10-15%,虚拟内存使用率约为 24.2%,并且正在使用 0 交换。
除了 Python 程序之外,没有其他用户执行的进程在 Pi 上运行。硬件正在运行带有 GUI 的默认 Raspbian 安装。
由于 Python 程序有 1000 多行,因此我不会在此问题文本中包含超出最小示例的任何内容。如果您想查看上下文信息,请查看此 Gist 和代码。
初步搜索表明这是 BytesIO 的一个已知问题。一些针对 Python 的旧错误跟踪(约 2014 年)表明,在 3.5 版本中对某些情况进行了改进。
问题是:
- 为什么
BytesIO
这里慢? - 是否有另一种更快的流式传输字节的方法?
- 有没有更好的方法来
BytesIO
获得我需要的东西?
编辑:我在循环中添加了一行,强制流在每个进程结束时使用 关闭stream.close()
,但这似乎无效。我仍然有 20 多秒的流打开时间。
EDIT_2:我从编辑的信息中误读了测试中的值,并错过了具有科学记数法的值。