值对于定义的数据类型过大
我正在从一个特殊的设备读取数据,这个设备的速度大约是每秒20兆字节。
/dev/dvb/adapter0/dvr0
我需要把这些内容读取出来,然后复制到其他的fifo(先进先出队列)中。
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这一行。
在谷歌上查了一下,似乎这个问题和C语言库以及32位指针有关,但我不明白这怎么会影响到我的Python版本,因为我的Python是64位的。
有没有什么建议呢?
1 个回答
1
我不知道你的 jobm
对象是什么,我猜这是你自己创建的,因为在谷歌上找不到类似的结果,如果我错了请纠正我。
你似乎是在打开视频设备进行读取,但视频设备一直在产生视频数据,而你却没有去读取这些数据,反而在那儿闲着。你似乎没有把 device_fd
传给你的 jobm 对象,所以它不知道这个文件描述符(fd)上有没有活动,因此它在你应该读取的时候处于休眠状态,这就导致了缓冲区溢出的问题。
你需要始终从 device_fd
中读取数据,只要有可用的数据就要读取。把这个 fd 传给 jobm,让它使用 poll
或 select
来检查是否有活动。
补充一下,抱歉,我漏掉了你问题中的一个细节。我之前说的还是适用,但没有那么直接——你需要同时关注输入和输出,而不仅仅是输出,原因我已经说过了。
如果 fifo 无法处理输出,导致你错过了对设备的读取,就会出现你现在遇到的问题。你需要要么 1) 创建一个可以存储几百 MB 数据的缓冲区,以防管道写入延迟,2) 丢弃一些数据包。如果数据的某部分缺失,DVB 应用应该能够处理这种情况。你也可以选择捕获并忽略这个异常,虽然这样会导致输出中出现轻微的损坏和缺失数据。