1

我正在尝试使用gpsd库解码一些非标准 AIS(带有额外信息标记的 nmea 字符串)数据。AIS 数据是从一个不断增加的文本文件中读取的(每天一个,换行符是新数据)。一些处理在 python 中完成,然后推送到 GPSD 解码器进行解码并返回给 python 进行更多工作。目前这是使用 os.system 或 subprocess.check_output (它们都花费相同的时间)和命令完成的:

echo "single_nmea_string" | gpsdecode

这行得通,但速度很慢。如果我将所有 NMEA 字符串写入文本文件并进行批量解码,它的速度会快 10-50 倍:

cat all_processed_nmea_strings.txt | gpsdecode

但这不能实时工作,因为我需要尽快处理传入的数据。

有没有办法在 Python 中打开 gpsdecode(或任何其他 cmdline 工具)的管道,在 nmea_strings 准备好时将其发送并读取结果,而无需一直启动/停止该工具?我已经在使用带队列的多处理来加快处理速度,但瓶颈是解码位。

有任何想法吗?

编辑:进一步的测试表明,“缓慢”可能与 cmdline 解码无关。这可能是我在工作人员之间拆分数据的地方。需要做一些分析。

4

1 回答 1

1

我认为subprocess.Popen在您的情况下使用有点不方便:您不能使用communicate(),因为它会等待子进程完成,因此您必须处理文件描述符并注意不填充管道缓冲区。有关一些想法,请参阅此问题

恕我直言,更好的选择是使用pexpectpackage

于 2017-03-13T08:54:00.757 回答