值对于定义的数据类型过大

1 投票
1 回答
3423 浏览
提问于 2025-04-16 08:38

我正在从一个特殊的设备读取数据,这个设备的速度大约是每秒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,让它使用 pollselect 来检查是否有活动。

补充一下,抱歉,我漏掉了你问题中的一个细节。我之前说的还是适用,但没有那么直接——你需要同时关注输入和输出,而不仅仅是输出,原因我已经说过了。

如果 fifo 无法处理输出,导致你错过了对设备的读取,就会出现你现在遇到的问题。你需要要么 1) 创建一个可以存储几百 MB 数据的缓冲区,以防管道写入延迟,2) 丢弃一些数据包。如果数据的某部分缺失,DVB 应用应该能够处理这种情况。你也可以选择捕获并忽略这个异常,虽然这样会导致输出中出现轻微的损坏和缺失数据。

撰写回答