Слишком большое значение для определенного типа данных - PullRequest
1 голос
/ 16 декабря 2010

Я читаю данные со специального устройства, которое производит около 20 МБ / с

/dev/dvb/adapter0/dvr0

Мне нужно прочитать содержимое и скопировать в другие файлы

    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-битными указателями, но я не понимаю, как это может повлиять на мою версию Python, 64-битную.

Есть предложения?

1 Ответ

1 голос
/ 16 декабря 2010

Я не знаю, каков ваш jobm объект, я предполагаю, что он создан вами, потому что это единственный результат Google для аналогичного объекта, поэтому исправьте меня, если я ошибаюсь.

Вы, кажется, открываете видеоустройство для чтения, видеоустройство постоянно генерирует видеоданные, и вместо чтения вы работаете на холостом ходу. Похоже, вы не отправляете device_fd на вашу работу, поэтому он не может знать, есть ли активность на fd, и поэтому он спит, когда вы должны читать, что создает переполнение буфера.

Вам необходимо всегда читать данные из device_fd, если они есть. Отправьте fd на задание и заставьте его использовать poll или select для поиска активности на нем.

Редактировать: Извините, я пропустил детали вашего вопроса. То, что я сказал, по-прежнему применимо, но не так прямо - вам нужно наблюдать как ваши входы и выходы, а не только ваши выходы, по той причине, о которой я говорил.

Если fifos не может обработать вывод, и в результате вы пропускаете чтение на вашем устройстве, вы получаете проблему, которую получаете. Вам нужно либо: 1) создать буфер, который содержит до нескольких сотен МБ данных на случай, если канал опаздывает на его запись, 2) отбросить пакеты. Приложения DVB должны обрабатывать это, если какая-то часть данных отсутствует. Вы также можете просто перехватить и проигнорировать исключение, хотя это приведет к незначительному повреждению и отсутствию данных в выходных данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...