1
keepeye 2022-03-01 15:39:19 +08:00
帮顶,试试 importlib.invalidate_caches() 不知道是不是用来清缓存的
|
2
iyaozhen OP @keepeye
importlib.invalidate_caches() Invalidate the internal caches of finders stored at sys.meta_path. If a finder implements invalidate_caches() then it will be called to perform the invalidation. This function should be called if any modules are created/installed while your program is running to guarantee all finders will notice the new module’s existence. 这个主要是发现新模块的,比如 a.b.c 多了个 a.b.c1 实际试了下也不会清 sys.modules |
3
ruanimal 2022-03-01 15:54:11 +08:00 1
|
5
hhhhhh123 2022-03-01 17:28:30 +08:00
用一个删一个 都在一个字典里面, 这样就行了, 我一起优化过一个服务刚好就是 7 ,8 k 得根据入参导入不同得文件 然后获取里面得函数 进行调用 一样得道理 , 用完即删除 无非是用时间换空间
|
6
zhengxiaowai 2022-03-01 17:57:04 +08:00
import 有个 hook ,感觉可以搞一下,盲猜一下思路大约是,启动不加载那些生成的 pb ,只有在用到的时候利用 hook 捕获一下,然后做一下动态导入,同时这个 hook 里还有一个 lru ,比如 500 个,超出 500 个的从 sys.module 中给他扔掉。
------ BTW, builder 这个服务不用太管它,,偶尔还会有内存泄露问题 :-) |
7
joApioVVx4M4X6Rf 2022-03-01 20:32:34 +08:00
楼主解决了吗
|
8
alphanow 2022-03-01 21:39:50 +08:00 via Android 1
sys.modules 只是一个 Python 引用列表,真正的对象是在堆记得,除了 Python 代码本身,底层的 C 代码有时也会对其存在引用。所以直接删除里面的条目可能是不起作用的。
所以有两个可能的解决方案: 用文件读取处理的方式生成一个对象,避免 import 开一个独立的 process 处理数据,用完直接干掉 |
9
iyaozhen OP @hhhhhh123 这样细节上不好操作
特别是请求量大的时候,比如 a.b.c1 a.b.c2 cache 里面有 a.b ,如果 a.b.c1 后删除 a.b cache ,刚好 a.b.c2 内部在用的时候取不到了 |
10
imn1 2022-03-01 21:48:54 +08:00
700G 内存,羡慕
|
11
iyaozhen OP |
13
iyaozhen OP @alphanow 「用文件读取处理的方式生成一个对象」这是什么操作,但可能也不行 因为文件内部还有 import 嵌套
「开一个独立的 process 处理数据,用完直接干掉」改成多进程模型,这倒好像可以,但其实就用不上缓存了,不知道性能如何 |
14
Cooky 2022-03-01 22:01:22 +08:00
整个多进程,让子进程处理,处理完了关了重开?
|
17
flynaj 2022-03-01 22:13:55 +08:00 via Android
要性能你上 golang,python,,
|
18
sujin190 2022-03-01 22:30:10 +08:00 via Android
每个实例将近 40G 内存,如果是模块占用内存多那真是好奇你这些 module 都用来干嘛了,几十 G 的代码文件啊,再说 python 的模块缓存好像是按代码文件纬度来的吧,c 模块应该是 so 级别的,你确定不是你 module 直接引用加载数据了,代码文件这么大,有点不科学
|
19
009694 2022-03-01 22:55:03 +08:00 via iPhone
fork 一个新进程去加载和计算你需要的动态库 用完即丢 。 动态需求要有动态的思路
|
20
ipwx 2022-03-01 23:13:52 +08:00
@iyaozhen 来自 php 时代的 trick ( php-fpm ):后台进程负责 import cache ,过一段时间就杀死。这样就能从头再来了。
|
21
ipwx 2022-03-01 23:15:03 +08:00 1
@sujin190 我这里也有个类似的需求,Python 在线生成 .so 然后 import 做计算的。.so 是根据上传的文本产生 C++ 代码然后编译出来 python 模块。。。所以用了个 subprocess
|
22
24owls 2022-03-01 23:23:24 +08:00
看了 #3 给的问题,import 进来的 module 无论如何也没法清除干净,那么想要清除干净就只能从一开始就不按照 importlib 默认的的机制来加载 module
#8 提到的避免 import 可能是添加一个 meta hook 吧,加载需要以后清除的 module 时,通过读取代码文件后手动 exec 来加载 |
23
ChrisFreeMan 2022-03-02 00:42:04 +08:00
这种规模的内存占用,不知道这辈子能不能遇上一次,我就围观好了
|
24
lolizeppelin 2022-03-02 09:27:18 +08:00
围观 好奇怎么能让代码这么大....
代码里塞数据了? |
25
ruanimal 2022-03-02 10:15:42 +08:00
@lolizeppelin 估计是模型文件之类的
|
27
iyaozhen OP @ChrisFreeMan 这不是因为使用问题嘛 正常哪需要这么多
|