【问题标题】:Speed up parsing of gzipped jsonlines files加速 gzipped jsonlines 文件的解析
【发布时间】:2020-03-23 14:32:30
【问题描述】:

我有大约 5,000 个 .gzip 文件(每个文件约 1MB)。这些文件中的每一个都包含jsonlines 格式的数据。这是它的样子:

{"category_id":39,"app_id":12731}
{"category_id":45,"app_id":12713}
{"category_id":6014,"app_id":13567}

我想解析这些文件并将它们转换为 pandas 数据框。有没有办法加快这个过程?这是我的代码,但有点慢(每个文件 0.5 秒)

import pandas as pd
import jsonlines
import gzip
import os
import io


path = 'data/apps/'
files = os.listdir(path)

result = []
for n, file in enumerate(files):
    print(n, file)
    with open(f'{path}/{file}', 'rb') as f:
        data = f.read()

    unzipped_data = gzip.decompress(data)

    decoded_data = io.BytesIO(unzipped_data)
    reader = jsonlines.Reader(decoded_data)

    for line in reader:
        if line['category_id'] == 6014:
            result.append(line)


df = pd.DataFrame(result)

【问题讨论】:

    标签: python gzip jsonlines


    【解决方案1】:

    这应该允许您在不加载整个文件的情况下读取每一行。

    import pandas as pd
    import json
    import gzip
    import os
    
    
    path = 'data/apps/'
    files = os.listdir(path)
    
    result = []
    for n, file in enumerate(files):
        print(n, file)
        with gzip.open(f'{path}/{file}') as f:
            for line in f:
                data = json.loads(line)
                if data['category_id'] == 6014:
                    result.append(data)
    
    
    df = pd.DataFrame(result)
    

    【讨论】:

    • 你只是在result.append(data) 上面加上if ... 行吗?
    • 是的,我还有其他不需要遍历行和过滤器的脚本,但它们也很慢。或者由于某种原因吃掉了太多的内存
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    相关资源
    最近更新 更多