用windows跑python脚本 跑一个小脚本,要吃多少内存

如果只是一个脚本解释器,Python简直是大材小用
我从来没有在项目中用过Python,最多的只是用它做一个方便的Shell脚本程序,把它嵌入到C++项目之前也做过几个实验,但是一直没有坐过部署的实验,以为就是把Python.dll和boost.python的dll(如果是静态链接版这个文件就可以省略)复制到可执行文件同级目录下一起复制到目标机器上就可以。结果昨天发现不行,我用的是静态版boost.python扩展,所以需要先调用Py_Initialize,如果系统安装了Python这步就没问题,但如果卸载掉,然后把Python33.dll文件复制到可执行文件夹下调用这个Python
API程序就会异常,昨晚因为这个问题我折腾到快1点也没搞定。今早上在google一查,已经有人问过这个问题,解决办法也很简单:把Python安装目录下的Lib文件夹整个复制到应用程序文件夹下即可。开始我是一个一个的按照错误提示往里复制,弄了十几个以后就没耐心了,最后把整个25.4M都复制进去,然后做减法,发现除了collections和encodings这两个文件夹外,其它目录都可以删除而不影响Python初始化。但是Lib下还有150+个py文件,再这么做减法太花时间,而且万一脚本要用到哪个组件还得往里复制,或者以后Python发布新版本也还得再逐一精简,所以就懒得清理了。如果要一个非常纤细的部署环境,又嫌逐一精简麻烦,可以先初始化一下Python,然后参考__pycache__文件夹下生成的pyc文件(Python
3.3在Py_Initialize之后会产生22个),它们都是初始化时根据所须py文件创建,然后到Lib目录下把不相关的py文件都删除即可获得一个最精简的Python嵌入版。话说回来,在这么精简的环境下,写出的脚本能有什么功能呢?一旦要用到Python内置的组件,还得再往回复制……
也就是说,要在项目中集成Python解释器,除了Python.dll,这里面应该主要实现的是譬如脚本词法分析,脚本语言的基础功能等,还要包括5M+的Python脚本库,这里面包括了诸如关键字、基础类和大多数脚本功能。应该说这算是一个大型的脚本解释器了,虽然其功能也非常强大。
相比之下,Lua就短小精悍多了,只需一个几百K的dll就可以实现脚本调用程序扩展和程序执行脚本等脚本系统最朴实的功能。当然Lua要想更进一步提供更多更能,LuaBind、LuaPlus等必不可少。
Python和Lua我都很喜欢,最终在项目中用什么要看具体需求,深入的了解它们,最终都是开发利器。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。想知道大家都用python写过哪些有趣的脚本? - 知乎3676被浏览281300分享邀请回答51 条评论分享收藏感谢收起13添加评论分享收藏感谢收起查看更多回答3 个回答被折叠()遇到个python进程占用内存太多的问题 | 盛大创新院团队博客 | 数据,更懂人心
我的图书馆
遇到个python进程占用内存太多的问题 | 盛大创新院团队博客 | 数据,更懂人心
在几个前辈的影响下,也开始用起了python,上手较快,并且觉得内存回收这些个烦心事自己也不用过问,自有解释器来完成。直到开始抓取某吧的帖子时才遇到问题。
抓取的思路很简单:获取某个分类下的所有的吧; 获取某个吧下的所有帖子;获取某个帖子的所有回复页。并且上面的每个步骤都是一个单独的接口实现。但是程序跑起来总是被莫名杀掉,并且dmesg查看会有“out of memory”的信息,应该是进程占用内存太大,被系统强制停掉。想着觉得不可思议,估算下,一个帖子只存储link和anchor,平均算上256byte,一个吧最多500w帖子,才用1G+多些,怎么会在一台16G的机器上down掉的呢(该机器虽然有其他程序,但每次进程退出时至少都占用了7G+).
于是开始找了些python的内存检测相关的工具和说明的页面看了看。
工具方面:
1、尝试valgrind检查,”确实看到很多xx are still reachable”的日志,而且这个xx数字越往后越大,囧。但是这些trace都是python解释器调用底层接口,也无法看懂(有个网页说到python2.x解释器可能存在内存泄露但还是先从自己程序找问题)。
2、cprofile分析:输出文件里有各个接口的调用次数和平均处理时间之类的,更像是解决性能的辅助工具。
3、尝试用gc模块的gc.collect接口进行强制的内存回收,没有效果。
4、尝试meliae:在上面的每次循环处理之后打印各个对象的占用情况,发现最多的对象都是beautifulsoup的Navigating占用了快80%的内存,于是在每次soup的find的object使用完后都强制del,仍然没有效果(感觉这个检测结果有点误导性)。
这个时候回头再仔细想了想之前的帖子里讲到的python的内存虽然会自动回收,但是回收完之后的内存并不是还给系统,而仍然是作为python的内存池。所以最根本的解决方法就是如何尽量少的让python从系统申请内存和复用自身的内存池资源。于是将上面的抓取流程稍微改动一下,每次并不是获取完一个吧的所有帖子,而且每次只获取一页的帖子,重新运行,便发现python的内存占用始终维持在0.2%左右了。
某种程序上来说,这种内存管理方式并没有能解释得通为何第一种写法会占用越来越大的内存;不过后来的解决方法却可以作为以后写python脚本时内存考虑的一个指导点。同时几种工具使用一遍,也是个不错的经历。更高追求的同学还可以关注下如何高效地释放内存的方式,我还没有尝试过。
TA的最新馆藏[转]&
喜欢该文的人也喜欢

我要回帖

更多关于 java 调用python脚本 的文章

 

随机推荐