Python 内存优化问题

2023-04-11 19:01:31 +08:00
 ChenJHua

我发现 import pymongo 就会占用 6M 内存。 我有 100 个独立运行的脚本,如果他们都需要 import pymongo ,那么就会产生 100*6=600M 内存。 可以实现一个 import 缓存,独立运行的脚本都可以优先复用缓存的包,缓存没有才重新导包。 想问问这个 import 缓存能实现吗

3888 次点击
所在节点    Python
59 条回复
roundgis
2023-04-12 09:06:55 +08:00
用 golang or rust 重寫吧
linggaoyuan123
2023-04-12 09:09:31 +08:00
ipc 改不了,那就改脚本啊,把一百个脚本缩小到 50 个,不就优化一半了。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
vicalloy
2023-04-12 09:13:44 +08:00
Varchar 的答案完全不可行。Python 本身就会提供 import 缓存,这么做完全是画蛇添足。如果你自己无法分别 AI 给的答案是否正确,建议不要直接发上来。
对于这个需求比较奇怪的一个点是,为啥会需要这么多个独立的脚本,而且还都需要常驻内存。
ChenJHua
2023-04-12 09:33:35 +08:00
@ClericPy 我只是举个例子,实际很多这些 import 。精确导入就看库实现的咋样了,精确导入我尝试了也是一样的资源占用的
ChenJHua
2023-04-12 09:35:11 +08:00
@akira 好的,谢谢你的建议
ChenJHua
2023-04-12 09:40:46 +08:00
@akira 好的,谢谢你的建议,我这边考虑下调度问题
ChenJHua
2023-04-12 09:42:26 +08:00
@009694 都是打工人,时间又不给,资源又不加,那我只能想耗时小的方法了
ruanimal
2023-04-12 09:42:33 +08:00
加内存啊,现在内存这么便宜。。。
featureoverload
2023-04-12 09:43:21 +08:00
100 个“脚本程序”,600MB 内存,优化个 X 。

有用的软件,直接按 32GB ,64GB ,128GB 考虑。

没有用的软件,“过早优化是万恶之源”。
ChenJHua
2023-04-12 09:44:00 +08:00
@whitewinds 好的,谢谢大佬建议
yinmin
2023-04-12 09:44:17 +08:00
这个问题无解,除非合并到 1 个进程,用线程 /协程跑多任务。
ChenJHua
2023-04-12 09:44:28 +08:00
@omgr 目前在对比升级 python3.11 看看,谢谢大佬建议
ChenJHua
2023-04-12 09:44:47 +08:00
@roundgis 领导批准就可以干了,哈哈哈哈
ChenJHua
2023-04-12 09:45:20 +08:00
@linggaoyuan123 也有点道理,我这边尝试一下合并,谢谢大佬建议
ChenJHua
2023-04-12 09:45:45 +08:00
@vicalloy 问就是历史遗留,哈哈哈哈
ChenJHua
2023-04-12 09:46:49 +08:00
@ruanimal tob 的设备都卖了,又不是云,不好加只能优化了
ChenJHua
2023-04-12 09:47:30 +08:00
@featureoverload 我只是举个例子,看看能不能优化独立脚本重复导包的内存占用。不早了,资源都没了
baobao1270
2023-04-12 09:48:59 +08:00
上微服务
不是让你真的上微服务,但是用微服务的思想解决这个问题
比如你可以把程序拆解为两个部分,一个部分是其余代码,另一个部分是调用 pymango 的代码
然后两个程序通过一些方式进行通信,比如 Unix Domain ,比如 gRPC ,比如 HTTP ,或者简单的读写文件也可以
你的 pymongo 可以单个进程运行,也可以开多个,比如 5 个,但是不需要 100 个那么多
你的其余代码进程可以 100 个同时运行
你可以用消息队列,或者生产者-消费者模型,来管理调度
featureoverload
2023-04-12 09:57:35 +08:00
@ChenJHua “优化独立脚本重复导包的内存占用” 针对这个问题而言。

如果脚本是一次性执行的。那么可以在父进程(死循环的那个程序)

1. 先 import pymongo;
2. 然后 os.fork
3. 子进程中:import {脚本}; {脚本}.run()
4. 脚本运行完退出子进程

从 LINUX(*nix)来说,父进程和子进程的“读”内存是共享的。而 import 的包显然是用来“读”的。

所以从原理上,逻辑推导是可以做到共享的。

但是 python 不是编译的直接在 LINUX 系统上直接运行的二进制可执行程序。
而是通过 cpython 这个二进制程序解释运行的。
所以实际能不能共享父进程和子进程的内存,要看具体实现,我没有实验过。

-------------

如果是我要解决这个问题的话,我会从上面的思路做试验测试看看会不会“优化独立脚本重复导包的内存占用”。
wuwukai007
2023-04-12 10:22:17 +08:00
建议上 celery ,控制 celery 的 worker 数量,worker 内执行脚本

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

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

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

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

© 2021 V2EX