我在解析文件夹中的 1000 个文本文件时遇到问题(每个文件大约 3000 行,大小约为 400KB)。我确实使用 readlines 阅读了它们,
for filename in os.listdir (input_dir) :
if filename.endswith(".gz"):
f = gzip.open(file, 'rb')
else:
f = open(file, 'rb')
file_content = f.readlines()
f.close()
len_file = len(file_content)
while i < len_file:
line = file_content[i].split(delimiter)
... my logic ...
i += 1
这对于我输入的样本(50,100 个文件)完全适用。当我在整个输入上运行超过 5K 文件时,所花费的时间远不接近线性增量。我计划进行性能分析并进行 Cprofile 分析。当输入达到 7K 文件时,更多文件所花费的时间随着达到更差的速率而呈指数增长。
这是 readlines 的累积时间,第一个 -> 354 个文件(来自输入的样本)和第二个 -> 7473 个文件(整个输入)
ncalls tottime percall cumtime percall filename:lineno(function)
354 0.192 0.001 **0.192** 0.001 {method 'readlines' of 'file' objects}
7473 1329.380 0.178 **1329.380** 0.178 {method 'readlines' of 'file' objects}
因此,我的代码所花费的时间不会随着输入的增加而线性缩放。我在 上阅读了一些文档注释readlines()
,人们声称这会将整个文件内容读入内存,因此与orreadlines()
相比通常会消耗更多内存。readline()
read()
我同意这一点,但是垃圾收集器是否应该在循环结束时自动从内存中清除加载的内容,因此在任何时候我的内存都应该只有我当前处理的文件的内容,对吗?但是,这里有一些问题。有人可以对这个问题提供一些见解。
这是python垃圾收集器的固有行为readlines()
还是我对python垃圾收集器的错误解释。很高兴知道。
此外,建议一些替代方法在内存和时间效率方面做同样的事情。TIA。