处理大型 .asc 文件的最快方法是什么?

What is the fastest way to process large .asc files?

我目前有从 CANoe 生成的 .asc 日志文件。我正在使用 python 来分析这些文件。这些文件非常大(从 .5GB 到 2GB 不等)。为了 read/analyze 数据,我将数据转换为数据帧,我使用以下代码行来执行此操作:

    log=can.ASCReader(filePath)
    log=[*log]
    df_data = [{'timestamp':m.timestamp, 'data':m.data} for m in log]
    df = pd.DataFrame(df_data)

通过我的分析,花费时间最长的部分是将迭代器转换为列表。我想知道是否有更有效的方法来做到这一点。如果速度更快,我也愿意以全新的方式完成整个过程。目前,一个 .6gb 的 .asc 文件大约需要 19 分钟才能 运行。任何 help/suggestiosn 将不胜感激!

最耗时的部分很可能是从磁盘读取。这是无法避免的。

但是,您可以确保不要将不必要的数据放入内存或四处复制。

尝试以下操作:

import operator
log=can.ASCReader(filePath)
pd.DataFrame(data=map(operator.attrgetter('timestamp', 'data'), log))

ASCReader 将 return 一个迭代器,即在您使用 log.

之前不读取数据

由于您只对timestampdata后面的值感兴趣,我们声明和attrgetter这两个属性。这是一个接受对象的函数,并且 return 只是该对象的两个给定属性。

为了将此 attrgetter 应用于日志,我们将使用 mapmap 会将 attrgetter 应用于 log 的每个元素。 map 也 return 是一个迭代器,即在使用之前它不会读取和存储任何数据。

最后我们把地图给pandas作为构建DataFrame的数据源。

这样做应该是复制数据或处理不必要数据最少的方法。 YMMV