大佬们,有谁研究过 Python importlib 机制? sys.modules 缓存太大了

2022-03-01 15:27:27 +08:00
 iyaozhen
有个业务需要动态加载很多本地文件( pb 生成的)

Python 自己的 sys.modules 缓存,加载过的都会缓存。而且是多级
比如一个模块是 a.b.c ,会生成 a a.b a.b.c 缓存

每个 request 是共用这个,会让 sys.modules 这个缓存越来越大,线上 20 来个实例,一共占用了 700 多 G 内存

https://docs.python.org/zh-cn/3/reference/import.html#the-module-cache
4309 次点击
所在节点    Python
27 条回复
ipwx
2022-03-01 23:15:03 +08:00
@sujin190 我这里也有个类似的需求,Python 在线生成 .so 然后 import 做计算的。.so 是根据上传的文本产生 C++ 代码然后编译出来 python 模块。。。所以用了个 subprocess
24owls
2022-03-01 23:23:24 +08:00
看了 #3 给的问题,import 进来的 module 无论如何也没法清除干净,那么想要清除干净就只能从一开始就不按照 importlib 默认的的机制来加载 module

#8 提到的避免 import 可能是添加一个 meta hook 吧,加载需要以后清除的 module 时,通过读取代码文件后手动 exec 来加载
ChrisFreeMan
2022-03-02 00:42:04 +08:00
这种规模的内存占用,不知道这辈子能不能遇上一次,我就围观好了
lolizeppelin
2022-03-02 09:27:18 +08:00
围观 好奇怎么能让代码这么大....

代码里塞数据了?
ruanimal
2022-03-02 10:15:42 +08:00
@lolizeppelin 估计是模型文件之类的
iyaozhen
2022-03-02 16:24:55 +08:00
@24owls 嗯嗯 我都试试
iyaozhen
2022-03-02 16:25:30 +08:00
@ChrisFreeMan 这不是因为使用问题嘛 正常哪需要这么多

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/837192

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX