我正在研究一个Python脚本,该脚本查询几个不同的数据库以整理数据并将所述数据持久保存到另一个数据库。该脚本从大约15个不同数据库中的数百万条记录中收集数据。为了尝试加快脚本速度,我提供了一些缓存功能,归结为拥有可容纳一些经常查询的数据的字典。字典包含键值对,其中键是根据数据库名称,集合名称和查询条件生成的哈希,而值是从数据库检索的数据。例如:
[{123456789: {_id: '1', someField: 'someValue'}},其中123456789是哈希,{_id: '1', someField: 'someValue'}是从数据库检索到的数据。
将这些数据保存在本地字典中意味着,我不必每次都查询数据库(这可能很慢,而不必每次都查询数据库),而是可以在本地访问一些经常查询的数据。如前所述,查询很多,因此字典可能会变得非常大(几个GB)。我有一些代码使用psutil来查看运行脚本的计算机上有多少可用内存,如果可用内存低于某个阈值,则清除字典。清除字典的代码是:cached_documents.clear()
cached_documents = None
gc.collect()
cached_documents = {}
我应该指出,cached_documents是一个局部变量,该变量被传递到所有访问或添加到缓存的方法中。不幸的是,这似乎不足以适当地释放内存,因为即使调用了上面的代码后,Python仍然占用大量额外的内存。您可以在此处查看内存使用情况的配置文件:
[值得注意的事实是,清除字典的前几次,我们向系统释放了大量内存,但是随后的每次时间似乎都更少,这时内存使用量趋于平缓,因为缓存被非常频繁地清除。因为Python占用大量内存,所以可用内存在阈值之内。
在清除字典时是否有一种方法可以强制Python正确释放内存,从而避免使用扁平衬里?任何提示表示赞赏。