cantools解析报文的效率

Python编程

使用cantools库,读取dbc后,批量解析,200万行的 报文blf和asc,并把解析结果:时间戳,信号名称,物理值,写入dataframe中。

常规解法,遍历 每行报文,进行decode,效率太低 ,时间太长。

大家可以试试 pypy,Numba,多进程等解法,目前无解。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    我认为使用pypy、Numba或者多进程都可以试一试,以下是我的具体建议:

    1. 使用pypy运行Python代码,它是一种不同于CPython的解释器,在某些情况下可以提升Python的运行速度。将代码中的Python库替换为支持pypy的库(例如,cffi替代ctypes),以便获得更好的性能。注意,pypy并非适用于所有Python代码,因此可能需要对你的代码进行修改。

    2. 使用Numba对slow loop进行优化,Numba是一种静态编译器,它将Python代码转换为高效的机器码。在循环中使用jit(just in time)装饰器,可以加快执行速度。例如:

    import numba as nb
    
    @nb.jit
    def decode_message(data):
        # 假设这个函数是遍历每行报文进行解码的函数
        pass
    
    1. 使用多进程,将报文分成多个部分并由不同的进程处理。例如,使用Python的multiprocessing库或者pathos库实现多进程。注意,将任务合理分配到多个进程中并不总能提高效率,还取决于计算机的硬件性能,因此需要进行一些实验来确定最佳的进程数量。

    除此之外,可以考虑以下几点来进一步优化效率:

    • 将数据读取到内存中,以减少磁盘访问的延迟。
    • 将消息解析后,存入更为高效的数据结构中,例如numpy数组或者pandas dataframe。
    • 如果无法使用pypy或Numba等工具,则可以尝试使用Cython编写一部分代码,将其编译为C语言扩展模块并在Python代码中调用。

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^