我手头有一个有趣的问题。作为一个初学者,在处理数据时甚至是一个不知名的数据时,我都喜欢这里退伍军人的一些提示。
我有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}}
答案 0 :(得分:3)
如果您要一遍又一遍地访问相同的压缩文件(从您的描述中不是特别清楚这是否是一次性操作),那么您应该将它们解压缩一次而不是每次阅读它们时都会对它们进行解压缩。
解压缩是一项CPU密集型操作,Python's gzip
module is not that fast与zcat
/ gunzip
等C实用程序进行比较。
可能最快的方法是gunzip
所有这些文件,将结果保存在某处,然后从脚本中的未压缩文件中读取。
其余部分并非真正的答案,但评论的时间太长了。为了加快速度,您需要考虑其他一些问题:
如果最后一个项目符号为true,则一个选项是加载每个JSON"文档"进入PostgreSQL 9.3数据库(JSON support is awesome和fast),然后从那里进行进一步的分析。希望您可以在加载JSON文档时从JSON文档中提取有意义的键。