【问题标题】:What is the fastest way to process large .asc files?处理大型 .asc 文件的最快方法是什么?
【发布时间】:2020-03-16 17:00:08
【问题描述】:

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

    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 分钟。任何帮助/建议将不胜感激!

【问题讨论】:

  • 函数DataFrame()有什么作用?如果可以重写它以获取迭代器,那将消除转换。
  • @LeeDanielCrocker pd.DataFrame 将字典列表转换为数据框。 pandas.pydata.org/pandas-docs/stable/reference/api/…
  • 你在说哪一行?您的示例代码中的第 2 行是否需要这么长时间?为什么会有这条线?
  • @M.Spiller 是的,第二行需要这么长时间。我这样做是为了将迭代器转换为列表,以便创建字典列表以转换为数据框表。
  • 但在第 3 行中,您只是在遍历列表。为什么不直接遍历从第 1 行返回的迭代器?

标签: python pandas canoe


【解决方案1】:

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

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

尝试以下方法:

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

ASCReader 将返回一个迭代器,即在您使用 log 之前不会读取数据。

由于您只对timestamp 和data 后面的值感兴趣,因此我们为这两个属性声明和attrgetter。这是一个函数,它接受一个对象,并且只返回该对象的两个给定属性。

为了将这个属性应用到日志中,我们将使用map。 map 会将 attrgetter 应用于 log 的每个元素。 map 还返回一个迭代器,即在使用之前它不会读取和存储任何数据。

最后我们把map放到pandas中作为数据源构建DataFrame。

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

【讨论】:

  • 感谢您的帮助!我认为这是我们能达到的最快速度。
猜你喜欢
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
  • 2013-07-01
  • 1970-01-01
  • 2019-01-30
  • 1970-01-01
  • 2013-03-03
  • 1970-01-01
相关资源
最近更新 更多