【发布时间】:2022-01-14 11:17:30
【问题描述】:
我正在尝试解析大量 json 文件。大约 60000 个 json 文件(大小范围 100 KB-700 MB)总共 1.8 TB,所以我制作了这个脚本来解析 json 文件并提取一些特征并将它们导出到 csv 文件中,它工作正常,但它的一些 json 文件非常慢解析需要 30 多分钟,我试图让它更快,但由于我的 python 经验短,我做不到。无论如何我可以让它更快,因为我需要更快地解析这些庞大的集合。我正在发布我的代码的 sn-p 我知道它有点转储,但我对 python 很陌生,并尽我所能。提前考虑
这是我的 json 文件的示例,请随时查看 https://gofile.io/d/vddzHY
count1=0
my_file_list = [f for f in glob.glob(r"E:\JsonOrgnized\Pach\*.json")]
final_result = []
for filename in my_file_list:
try:
with open(filename, 'r', encoding='utf8', errors='ignore') as f:
row = {}
info = ijson.items(f, 'info')
f.seek(0)
for o in info:
row['AA-Added']= float(o.get('added'))
row['AB-Started']= float(o.get('started'))
row['AC-Duration']= o.get('duration')
row['AD-Ended']= float(o.get('ended'))
f.seek(0)
domains = ijson.items(f, 'network.domains.item')
domain_count = 0
for domain in domains:
domain_count+=1
row['AE-DomainCount'] = domain_count
f.seek(0)
signatures = ijson.items(f, 'signatures.item')
signature_count = 0
for signature in signatures:
signature_count+=1
row['AF-SignatureCount'] = signature_count
f.seek(0)
domains = ijson.items(f, 'behavior.generic.item')
domain_count = 0
for domain in domains:
domain_count+=1
row['AG-GenericCount'] = domain_count
f.seek(0)
apistats = ijson.items(f, 'behavior.apistats')
apistat_count = 0
for apistat in apistats:
for inner_apistat in apistat:
apistat_count+=1
row['AH-ApistatCount'] = apistat_count
f.seek(0)
processes = ijson.items(f, 'behavior.processes.item')
process_count = 0
for process in processes:
process_count+=1
row['AI-ProcessCount'] = process_count
f.seek(0)
summaries = ijson.items(f, 'behavior.summary')
summary_count = 0
for summary in summaries:
for inner_summary in summary:
summary_count+=1
row['AJ-SummaryCount'] = summary_count
f.seek(0)
apistats_element = ijson.items(f, 'behavior.apistats')
for inner_apistats in apistats_element:
for index, inner_fields in inner_apistats.items():
row = dict(Counter(row)+Counter(inner_fields))
row['AK-Filename'] = os.path.basename(filename)
except Exception as e:
#pass
#print(f"Filename {filename} has issue with {e}")
row = {}
if row:
final_result.append(row)
count1+=1
print("File Number" , count1 , "Is Finished!")
Print("<<<<<<<<<<<<<<<<<<<DONE>>>>>>>>>>>>>>>>>>")
【问题讨论】:
-
您正在阅读每个文件八次 - 这似乎是消除(浪费)时间的明显机会。您是否尝试过一次读取+处理每个文件?但是你今天早些时候不是已经问过这个了吗,这个问题似乎是一样的——你的问题被解决了吗?为什么?
-
请把你的文件的最小样本编辑成你的问题作为文本而不是我永远不会点击的非现场链接。
-
你的 except 忽略异常是一种危险的方法 - 可能隐藏各种恐怖 - 至少让它打印或记录错误,以便你知道它们正在发生。
-
@balmy 感谢您的回答,是的,这是我向他寻求帮助的同一个问题,但不知道他发布了这个问题,所以感谢他的帮助并感谢您的回答跨度>
-
@JonSG 非常感谢,非常感谢