python - 值对于定义的数据类型来说太大

标签 python linux

我正在从一个产生大约 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,并使其使用 pollselect 来查找其上的事件。

编辑:对不起,我遗漏了您问题中的一个细节。我所说的仍然适用,但不是那么直接——你需要同时观察你的输入和输出,而不仅仅是你的输出,因为我已经说过的原因。

如果 fifos 无法处理输出,结果您错过了设备上的读取,您就会遇到您遇到的问题。您需要 1) 创建一个最多可容纳数百 MB 数据的缓冲区,以防管道写入延迟,2) 丢弃数据包。如果数据的某些部分丢失,DVB 应用程序应该处理它。您也可以简单地捕获并忽略异常,尽管这会导致输出中出现轻微损坏和数据丢失。

关于python - 值对于定义的数据类型来说太大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4463975/

相关文章:

python - Django JSONDecodeError at ...= get_response(request)

python - 没有名为 Flask (GAE) 的模块

Linux 上的 Python 版本

linux - 删除名称中带连字符的目录

c++ - char* const args[] 定义

linux - openssh RPM CentOS 6.5 的 Pam 配置

python - 无法在 <module 'Word2VecKeyedVectors' > 上获取属性 'gensim.models.keyedvectors'

Python - socketio 导入错误

python - sudo 和 pip 不在同一条路径上

linux - 每个版本都会下载 Yocto zip