我正在编写一个自定义文件系统爬虫,它通过sys.stdin传递了数百万个glob进行处理。我发现当运行脚本时,其内存使用量随时间的推移而急剧增加,整个过程几乎无法进行。我在下面编写了一个最小化的示例来显示问题。我是做错了什么,还是发现了Python / glob模块中的错误?(我正在使用python 2.5.2)。
#!/usr/bin/env python
import glob
import sys
import gc
previous_num_objects = 0
for count, line in enumerate(sys.stdin):
glob_result = glob.glob(line.rstrip('\n'))
current_num_objects = len(gc.get_objects())
new_objects = current_num_objects - previous_num_objects
print "(%d) This: %d, New: %d, Garbage: %d, Collection Counts: %s"\
% (count, current_num_objects, new_objects, len(gc.garbage), gc.get_count())
previous_num_objects = current_num_objects
输出结果如下:
(0) This: 4042, New: 4042, Python垃圾:0,Python收集计数:(660,5,0) (1) This: 4061, New: 19, Python垃圾:0,Python收集计数:(90,6,0) (2) This: 4064, New: 3, Python垃圾:0,Python收集计数:(127,6,0) (3) This: 4067, New: 3, Python垃圾:0,Python收集计数:(130,6,0) (4) This: 4070, New: 3, Python垃圾:0,Python收集计数:(133,6,0) (5) This: 4073, New: 3, Python垃圾:0,Python收集计数:(136,6,0) (6) This: 4076, New: 3, Python垃圾:0,Python收集计数:(139,6,0) (7) This: 4079, New: 3, Python垃圾:0,Python收集计数:(142,6,0) (8) This: 4082, New: 3, Python垃圾:0,Python收集计数:(145,6,0) (9) This: 4085, New: 3, Python垃圾:0,Python收集计数:(148,6,0)每100次迭代,会释放100个对象,因此每100次迭代,
len(gc.get_objects())
会增加200。而len(gc.garbage)
保持不变为0。二代收集计数缓慢增加,而0代和1代的计数则上下波动。