我正在从一个产生大约 20 MB/s 的特殊设备读取数据
/dev/dvb/adapter0/dvr0
我需要读取内容复制到其他fifos
device_fd = os.open(video_device_file, os.O_RDONLY)
while True:
if jobm.has_jobs():
chunk = os.read( device_fd, 1024 * 1000 )
fifom.write2all(chunk)
jobm.idle()
运行一整晚后,我收到以下错误:
[Errno 75] 值对于定义的数据类型来说太大了
在 os.read 行中。
从 google 看来这与 c 库和 32 位指针有关,但我看不出这会如何影响我的 64 位 python 版本。
有什么建议吗?
最佳答案
我不知道你的 jobm
对象是什么,我假设它是由你创建的,因为这是类似对象的唯一谷歌结果,所以如果我错了请纠正我。
你好像是在打开视频设备进行阅读,视频设备不断地产生视频数据,而不是阅读,你在闲置。你似乎没有将 device_fd
发送到你的 jobm 东西,所以它不知道 fd 上是否有事件,所以当你应该阅读时它正在 sleep ,这会创建一个缓冲区溢出。
如果有任何可用数据,您需要始终从 device_fd
读取数据。将 fd 发送到 jobm,并使其使用 poll
或 select
来查找其上的事件。
编辑:对不起,我遗漏了您问题中的一个细节。我所说的仍然适用,但不是那么直接——你需要同时观察你的输入和输出,而不仅仅是你的输出,因为我已经说过的原因。
如果 fifos 无法处理输出,结果您错过了设备上的读取,您就会遇到您遇到的问题。您需要 1) 创建一个最多可容纳数百 MB 数据的缓冲区,以防管道写入延迟,2) 丢弃数据包。如果数据的某些部分丢失,DVB 应用程序应该处理它。您也可以简单地捕获并忽略异常,尽管这会导致输出中出现轻微损坏和数据丢失。
关于python - 值对于定义的数据类型来说太大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4463975/