2017-03-13 7 views
1

gpsd 라이브러리를 사용하여 일부 비표준 AIS (추가 정보 태그가있는 nmea 문자열) 데이터를 디코딩하려고합니다. AIS 데이터는 지속적으로 증가하는 텍스트 파일 (하루에 하나씩 새로운 데이터 인 개 글을 사용하여)에서 읽습니다. 일부 처리는 파이썬에서 수행 된 후 GPSD 디코더로 보내져 디코딩되고 더 많은 작업을 위해 파이썬으로 반환됩니다. 현재이 명령으로 os.system을하거나 subprocess.check_output를 (둘 다 동일한 시간을)를 사용하여 수행됩니다PYTHON, LINUX : cmdline에서 스트리밍

echo "single_nmea_string" | gpsdecode 

이 작동하지만 고통스럽게 느린.

cat all_processed_nmea_strings.txt | gpsdecode 

하지만 난 즉시 처리 할 들어오는 데이터를 필요로하기 때문에이 실시간으로 작동하지 않을 수 있습니다 : 나는 텍스트 파일로 모든 NMEA 문자열을 작성하고 대량 디코딩을 할 경우는 10 ~ 50 배 빠른 속도입니다 가능한 한.

파이썬에서 gpsdecode (또는 다른 cmdline 도구)에 파이프를 열 수있는 방법이 있습니까? nmea_strings을 준비가되어있는 상태로 보내고 전체 시간에 도구를 시작/중지하지 않고 결과를 읽을 수 있습니까? 이미 처리 속도를 높이기 위해 대기열과 함께 다중 처리를 사용하고 있지만 병목 현상은 디코딩 비트입니다.

아이디어가 있으십니까?

편집 : 추가 테스트를 통해 "느려짐"이 cmdline 디코딩과 관련 없음을 알 수 있습니다. 그것은 내가 작업자간에 데이터를 분리하는 곳일 수 있습니다. 프로파일 링을해야 할 것입니다.

답변

1

내 생각에 subprocess.Popen은 상황에 따라 약간 불편합니다 : 서브 프로세스가 완료 될 때까지 기다릴 것이므로 communicate()을 사용할 수 없으므로 파일 설명자를 처리하고 파이프 버퍼를 채우지 않아야합니다. 몇 가지 아이디어는 this question을 참조하십시오.

더 나은 옵션 IMHO는 pexpect package을 사용하는 것입니다.

+0

이 방법이 효과가 있지만 개선되지는 않습니다. 문제는 스크립트의 다른 부분에있을 수 있다고 생각합니다. 프로세스 근로자간에 데이터를 분할하는 방식과 관련이있을 수 있습니다. 도움을 주셔서 감사합니다, 이것은 정확히 내가 문제가 무엇인지 알았을 때 내가 찾고있는 도구의 종류입니다. – RedM