![]() | 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 imlements 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 ![]() |
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 ![]() 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 ![]() @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 这不是因为使用问题嘛 正常哪需要这么多 |