我编写了一个连续脚本,每隔几秒钟从互联网上收集一些数据,将其保留在内存中一段时间,定期将其全部存储到数据库然后将其删除。为了保证一切顺利运行,我使用线程同时从多个源收集数据。为了最小化数据库操作并避免与其他数据库进程冲突,我只是偶尔写。
永远不会返回已删除变量的内存,并最终变得如此之大,以至于脚本崩溃(由tracemalloc和pympler显示)。我想我正在处理错误的线程数据,但我不知道如何以不同的方式做到这一点。下面的最小例子。
另外:我不认为我可以使用队列,因为实际上有多个函数从这一点开始,修改不同的局部变量。
import threading
import time
import tracemalloc
import pympler.muppy, pympler.summary
import gc
tracemalloc.start()
def a():
# collect data
collection.update({int(time.time()): list(range(1,1000))})
return
collection = {}
threads = []
start = time.time()
cycle = 0
while time.time() < start + 60:
cycle += 1
t = threading.Thread(target = a)
threads.append(t)
t.start()
time.sleep(1)
for t in threads:
if t.is_alive() == False:
t.join()
# periodically delete data
delete = []
for key, val in collection.items():
if key < time.time() - 10:
delete.append(key)
for delet in delete:
print('DELETING:', delet)
del collection[delet]
gc.collect()
print('CYCLE:', cycle, 'THREADS:', threading.active_count(), 'COLLECTION:', len(collection))
print(tracemalloc.get_traced_memory())
all_objects = pympler.muppy.get_objects()
sum1 = pympler.summary.summarize(all_objects)
pympler.summary.print_(sum1)