读取/解析大量JSON.gz文件的优化技巧

时间:2014-09-10 20:24:02

标签: python json

我手头有一个有趣的问题。作为一个初学者,在处理数据时甚至是一个不知名的数据时,我都喜欢这里退伍军人的一些提示。

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

这一切都花了我大约3个小时。大量插入Pytable并没有真正帮助提高速度。大部分时间都是从解析的JSON线获取值,因为它们具有真正可怕的结构。有些是直截了当的,如'attrname':attrvalue,但有些是复杂而耗时的结构,如:

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

...我需要获取value数组中所有具有相应attr的对象的name,并忽略那些不对应的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) 。所以我需要遍历列表并检查里面的每个JSON对象。 (如果你能指出任何更快捷的方法,我会很高兴,如果它存在的话)

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

所以我进行了一些测试(我现在没有这些数字),甚至在删除了我的程序的解析部分之后;只是逐行浏览文件本身花了相当多的时间。

所以我问:你觉得这个问题的任何一部分你可能做得不够理想吗?

{{1}}

1 个答案:

答案 0 :(得分:3)

一小块"低垂的水果"

如果您要一遍又一遍地访问相同的压缩文件(从您的描述中不是特别清楚这是否是一次性操作),那么您应该将它们解压缩一次而不是每次阅读它们时都会对它们进行解压缩。

解压缩是一项CPU密集型操作,Python's gzip module is not that fastzcat / gunzip等C实用程序进行比较。

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

其他问题

其余部分并非真正的答案,但评论的时间太长了。为了加快速度,您需要考虑其他一些问题:

  1. 你想用所有这些数据是什么?
  2. 您真的需要立即加载所有吗?
    • 如果您可以将数据分成更小的部分,那么即使不是所需的总时间,也可以减少程序的延迟。例如,您可能知道您只需要特定文件中的一些特定行,无论您正在尝试做什么分析......太棒了!只加载那些特定的行。
    • 如果您 需要以任意和不可预测的方式访问数据,那么您应该将其加载到另一个系统(RDBMS?)中,该系统以更适合各种类型的格式存储它分析你正在做的事情。
  3. 如果最后一个项目符号为true,则一个选项是加载每个JSON"文档"进入PostgreSQL 9.3数据库(JSON support is awesomefast),然后从那里进行进一步的分析。希望您可以在加载JSON文档时从JSON文档中提取有意义的键。