用于读取/解析大量JSON.gz版文件夹

2024-09-24 02:28:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我手头有个有趣的问题。作为一个刚开始处理数据的人,我很乐意从这里的老兵那里得到一些建议。在

我有大约6000Json.gz版总共约5GB的压缩文件和20GB的未压缩文件。 我打开每个文件并使用gzip模块逐行读取它们;然后使用json.loads()加载每一行并解析复杂的JSON结构。然后,在迭代到下一个文件之前,我会将每个文件中的行一次性插入到Pytable中。在

这一切花了我3个小时。大容量插入Pytable并没有真正提高速度。大部分时间都是从解析的JSON行获取值的,因为它们的结构非常糟糕。有些结构简单明了,如'attrname':attrvalue,但有些结构复杂且耗时,如:

'attrarray':[{'name':abc, 'value':12},{'value':12},{'name':xyz, 'value':12}...]

…其中我需要获取attr数组中所有具有相应name的对象的value,忽略那些没有对应的对象。因此,我需要遍历列表并检查其中的每个JSON对象。我很高兴你能更快地指出这一点

所以我想它的实际解析部分没有太大的加速范围。我认为他们的可能是加速的范围是实际读取文件部分。在

因此,我运行了一些测试(我现在没有数字),甚至在删除了程序的解析部分之后;简单地逐行检查文件本身需要花费大量的时间。在

所以我问:在这个问题中,你认为我做得不够理想吗?在

for filename in filenamelist:
    f = gzip.open(filename):
    toInsert=[]
    for line in f:
        parsedline = json.loads(line)
        attr1 = parsedline['attr1']
        attr2 = parsedline['attr2']
        .
        .
        .
        attr10 = parsedline['attr10']
        arr = parsedline['attrarray']
        for el in arr:
            try:
                if el['name'] == 'abc':
                    attrABC = el['value']
                elif el['name'] == 'xyz':
                    attrXYZ = el['value']
                .
                .
                .
            except KeyError:
                pass
        toInsert.append([attr1,attr2,...,attr10,attrABC,attrXYZ...])

    table.append(toInsert)

Tags: 文件对象nameinjsonforvalue结构
1条回答
网友
1楼 · 发布于 2024-09-24 02:28:30

一块清晰的“低挂水果”

如果您要反复访问相同的压缩文件(从您的描述中看这是否是一次性操作并不特别清楚),那么您应该将它们解压缩一次,而不是每次读取时都立即解压缩。在

解压是一个CPU密集型操作,与zcat/gunzip等C实用程序相比,Python's ^{} module is not that fast。在

可能最快的方法是gunzip所有这些文件,将结果保存到某个地方,然后从脚本中的未压缩文件中读取。在

其他问题

剩下的并不是一个真正的答案,但评论太长了。为了加快速度,您需要考虑几个其他问题:

  1. 你想用这些数据做什么?在
  2. 你真的需要一次加载所有的文件吗?
    • 如果您可以将数据分割成更小的片段,那么您可以减少程序的延迟(如果不是所需的总时间)。例如,您可能知道您只需要从特定文件中的几行特定的行来进行任何分析。。。太好了!只加载那些特定的行。在
    • 如果您需要以任意和不可预知的方式访问数据,那么您应该将其加载到另一个系统(RDBMS?)它以一种更适合于分析的格式存储它。在

如果最后一个要点是真的,那么可以选择将每个JSON“document”加载到postgresql9.3数据库中(即JSON support is awesome和{a3}),然后从中进行进一步的分析。希望您可以在加载JSON文档时从它们中提取有意义的键。在

相关问题 更多 >