我必须遍历30GB的文件(其中有30个文件),而500mb大约需要15分钟。 知道我正在逐行循环,如何优化性能?
Python
import json
import os
def file_subreddit_comments(rfname,wfname):
with open(rfname, 'r', encoding="utf8") as rf:
with open(wfname, 'w', encoding="utf-8") as wf:
for i, l in enumerate(rf):
d = json.loads(l)
link_id = d["link_id"]
for lsi in list_submission_id:
constructed_link_id = "t3_" + lsi
if link_id == constructed_link_id:
wf.write(l)
defaultFilePath = r'D:\Users\Jonathan\Desktop\Reddit Data\Run Comments\\'
directory = os.fsencode(defaultFilePath)
list_submission_id = []
submission_id_file = r'D:\Users\Jonathan\Desktop\Reddit Data\Manipulated Data-09-03-19-Final\UniqueIDSubmissionsList-09-03-2019.txt'
with open(submission_id_file, "r", encoding="utf8") as sif:
for i, l in enumerate(sif):
list_submission_id.append(l.rstrip())
for file in os.listdir(directory):
filename = os.fsdecode(file)
comment_path_read = defaultFilePath + filename
comment_path_save = defaultFilePath + filename + "_ext_com.txt"
file_subreddit_comments(comment_path_read,comment_path_save)
print(filename)
submission_id_file
是一个列表,其中包含大约1000个关键字,并且需要验证constructured_link_id
的值是否在列表中。
答案 0 :(得分:1)
多线程和多处理可能是Thom上面提出的解决方案。好吧,至少它减少了我执行任务的时间。 12个内核= 12个文件被同时操纵。
答案 1 :(得分:0)
如果在旋转的拼盘硬盘上执行此操作,则可能会遇到寻道时间问题。尝试将所有数据写入内存中的对象,然后最后一次将其全部转储到文件中。
我不能百分百地确定这是问题所在,只是理论上的问题。容易尝试。
编辑:刚刚发现了另一个大大的加速。
改为设置list_submission_id
list_submission_id = set()
list_submission_id.add("t3_" + l.rstrip())
然后使用以下方法检查成员资格:
link_id = d["link_id"]
if link_id in list_submission_id :
wf.write(l)
与我的其他建议不同,这肯定会大大加快速度。