我手头有个有趣的问题。作为一个刚开始处理数据的人,我很乐意从这里的老兵那里得到一些建议。在
我有大约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}...]
…其中我需要获取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)
一块清晰的“低挂水果”
如果您要反复访问相同的压缩文件(从您的描述中看这是否是一次性操作并不特别清楚),那么您应该将它们解压缩一次,而不是每次读取时都立即解压缩。在
解压是一个CPU密集型操作,与} module is not that fast 。在
zcat
/gunzip
等C实用程序相比,Python's ^{可能最快的方法是
gunzip
所有这些文件,将结果保存到某个地方,然后从脚本中的未压缩文件中读取。在其他问题
剩下的并不是一个真正的答案,但评论太长了。为了加快速度,您需要考虑几个其他问题:
如果最后一个要点是真的,那么可以选择将每个JSON“document”加载到postgresql9.3数据库中(即JSON support is awesome和{a3}),然后从中进行进一步的分析。希望您可以在加载JSON文档时从它们中提取有意义的键。在
相关问题 更多 >
编程相关推荐