2010-12-16 4 views
1

Читают данные из специального устройства, которое производит около 20 МБ/сЗначения слишком велики для определенного типа данных

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

Любые предложения?

+1

Является ли ваш Python скомпилированным для 64-битной ОС? – nmichaels 2010-12-16 18:12:59

ответ

1

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

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

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

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

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