【问题标题】:Getting a Pandas dataframe from an Apache log file从 Apache 日志文件中获取 Pandas 数据帧
【发布时间】:2016-01-23 00:25:49
【问题描述】:

我有一个包含 1,770,781 行表单的日志文件

[02/Jan/2015:08:08:43] "GET /click?article_id=139&user_id=19550 HTTP/1.1" 200 3078

我想提取时间、article_id 和 user_id,并将它们组合成一种方便的格式进行分析。现在,我有以下代码可以提取这些元素并尝试将它们组合到 Pandas DataFrame 中:

logs = pd.DataFrame(columns=['time', 'article_id', 'user_id'])
regex = '\[(?P<time>.*?)\] "GET (.*?=)(?P<article_id>\d+)(&.*?=)(?P<user_id>\d+)'

for line in log_file:
    time = re.match(regex, line).group('time')
    article_id = re.match(regex, line).group('article_id')
    user_id = re.match(regex, line).group('user_id')
    logs.append([time, article_id, user_id])

但这需要很长时间才能运行,我开始认为我应该放弃这种方法。有什么办法可以提高效率吗?尝试这样做是否现实?如果没有,是否有更好的方法来获取这些数据?

【问题讨论】:

    标签: python apache pandas optimization


    【解决方案1】:

    您没有使用re.compile,而且您还进行了三次低效匹配,而在循环内一次就足够了。

    logs = pd.DataFrame(columns=['time', 'article_id', 'user_id'])
    # regc = re.compile(r'\[(?P<time>.*?)\] "GET (.*?=)(?P<article_id>\d+)(&.*?=)(?P<user_id>\d+)')
    # alternative regexp that might be more efficient
    regc = re.compile(r'\[(?P<time>.+)\] "GET (?:.+article_id=)(?P<article_id>\d+)(?:&user_id=)(?P<user_id>\d+)')
    
    for line in log_file:
        m = regc.match(line)
        time = m.group('time')
        article_id = m.group('article_id')
        user_id = m.group('user_id')
        logs.append([time, article_id, user_id])
    

    【讨论】:

    • 第四行的意思是m=re.match(regc, line)
    • @dmdmdmdmdmd regex 不应该在那里,我编辑了我的答案。
    • 好的,非常感谢您的回复。我估计这将需要大约 60 分钟才能运行。有没有更好的方法来做到这一点?
    • @dmdmdmdmdmd 我对熊猫没有太多经验。你能排除因此而减速的可能性吗,即首先logs = [],然后循环logs.append((time, article_id, user_id))
    猜你喜欢
    • 2021-09-24
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 2022-10-13
    • 2017-03-11
    相关资源
    最近更新 更多