我正在执行后面的python代码。
我在一个文件夹(" articles")上运行它,它有几百个子文件夹和240,226个文件。
我正在计时执行。起初时间非常稳定,但在100,000个文件后变为非线性。现在时间(我以10,000个文件间隔计时)可以在30,000左右(或不是)之后变为非线性。
我打开了任务管理器,并通过python.exe将减速与99%的磁盘使用率相关联。我做过gc-collect()。 dels等,关闭了Windows索引。我已重新启动Windows,清空垃圾箱(我有几百GB免费)。没有任何帮助,如果有的话,磁盘使用似乎变得更加不稳定。
很抱歉很长的帖子 - 谢谢你的帮助
def get_filenames():
for (dirpath, dirnames, filenames) in os.walk("articles/"):
dirs.extend(dirnames)
for dir in dirs:
path = "articles" + "\\" + dir
nxml_files.extend(glob.glob(path + "/*.nxml"))
return nxml_files
def extract_text_from_files(nxml_files):
for nxml_file in nxml_files:
fast_parse(nxml_file)
def fast_parse(infile):
file = open(infile,"r")
filetext = file.read()
tag_breaks = filetext.split('><')
paragraphs = [tag_break.strip('p>').strip('</') for tag_break in tag_breaks if tag_break.startswith('p>')]
def run_files():
nxml_files = get_filenames()
extract_text_from_files(nxml_files)
if __name__ == "__main__":
run_files()
答案 0 :(得分:0)
有些事情可以优化。
首先,您打开文件,关闭它们。 with open(...) as name:
块可以轻松完成。 Python 2中的BTW file
对于变量名称来说是一个糟糕的选择,它是内置函数的名称。
您可以通过执行字符串比较而不是glob来删除一个光盘读取。
最后但并非最不重要:os.walk
巧妙地吐出结果,所以不要将它们缓冲到列表中,处理一个循环内的所有内容。这将节省大量内存。
这是我可以从代码中提出的建议。有关导致I / O的更多详细信息,您应该使用分析。有关详细信息,请参阅https://docs.python.org/2/library/profile.html。