我的python应用程序有问题,我认为它与python垃圾收集有关,即使我不确定...
问题是我的应用程序需要花费大量时间退出并切换到下一个功能.
在我的应用程序中,我处理非常大的字典,包含数千个大型对象,这些对象是从包装的C++类中实例化的.
我在程序中放了一些时间戳输出,我看到在每个函数结束时,当函数内部创建的对象超出范围时,解释器在调用下一个函数之前花费了大量时间.并且我在应用程序结束时观察到同样的问题,程序应该退出:在屏幕上的最后一个时间戳和新提示的外观之间花费了很多时间(〜小时!).
内存使用情况稳定,所以我真的没有内存泄漏.
有什么建议?
可以成千上万的大型C++对象的垃圾收集速度慢吗?
有没有办法加快这个?
更新:
非常感谢您的所有答案,您给了我很多调试我的代码的提示:-)
我在Scientific Linux 5上使用Python 2.6.5,这是一个基于Red Hat Enterprise 5的自定义发行版.实际上,我并没有使用SWIG为我们的C++代码获取Python绑定,而是使用Reflex/PyROOT框架.我知道,它在粒子物理学之外并不是很有名(但仍然是开源的,可以免费获得),我必须使用它,因为它是我们主要框架的默认值.
在这种情况下,来自Python端的DEL命令不起作用,我已经尝试过了.DEL只删除链接到C++对象的python变量,而不是内存中的对象本身,它仍然由C++端拥有...
......我知道,这不是标准我猜,有点复杂,对不起:-P
但是按照你的提示,我会描述我的代码,我会按照你的建议给你回复更多细节.
额外更新:
好的,按照你的建议,我用我的代码检测cProfile,我发现实际上gc.collect()功能是占用大部分运行时间的功能!
这里是cProfile+ pstats print_stats()的输出:
>>> p.sort_stats("time").print_stats(20)
Wed Oct 20 17:46:02 2010 mainProgram.profile
547303 function calls (542629 primitive calls) in 548.060 CPU seconds
Ordered by: internal time
List reduced from 727 to 20 due to restriction
ncalls tottime percall cumtime percall filename:lineno(function)
4 345.701 86.425 345.704 86.426 {gc.collect}
1 167.115 167.115 200.946 200.946 PlotD3PD_v3.2.py:2041(PlotSamplesBranches)
28 … 我目前正在努力修改我的Genymotion Android模拟器的主机文件.
使用Genymotion时,众所周知的重新安装,拉动和推动方式似乎根本不起作用,因为文件系统始终是只读的并且重新安装被拒绝.
之前我认识到Genymotion VM已经附带超级用户,所以我打开了shell并且su'd,但问题是一样的:文件系统是只读的.
有没有人知道如何在Genymotion VM中更改该文件?
谢谢
阿恩
我们为Android手机的客户提供一个默认应用程序.哪个用户无法卸载.我已使用此示例中的设备管理功能但用户可以通过停用设置来删除应用.
我发现在系统/应用程序文件夹中安装应用程序的另一种可能方式,如所有谷歌应用程序(我不确定).
为此,我需要root访问权限,所以我打算做以下操作,但不确定如何实现它.
像许多系统应用程序一样,他们如何为这种功能做些什么?
请帮忙.
有没有人知道如何在从源代码(AOSP)构建android时包含超级用户权限?
我最近开始使用ConfigParser()为我的python脚本添加一些功能给它们配置文件.我知道如何使用它,但我有一个问题.我的脚本需要使用sudo作为root用户运行.配置文件在,~/.config/scriptconfig/但是当您以sudo身份运行脚本时,它会临时将用户更改为root,因此它找不到配置文件.我想要做的是获取有效用户的配置文件,以便抓取/home/myuser/.config/scriptconfig/config.cfg而/root/.config/scriptconfig/config.cfg不是存在.
我需要脚本能够在不同的机器上运行,而不仅仅是我的.所以我需要获得有效用户的主目录
这是我尝试使用的代码示例:
import os, ConfigParser
config = ConfigParser.RawConfigParser()
homepath = os.path.expanduser("~/")
configpath = homepath + ".config/scriptconfig/config.cfg"
config.read(configpath)
get = config.get('Config', 'Example')
print get
它应该打印example配置文件的值,但是当以sudo身份运行时,路径是/home/root这样,它找不到配置文件. 我正在研究AOSP.我已经成功添加了我的apk来构建.现在我想给我的应用程序root权限.我不想提供对其他应用程序的root访问权限或在我的构建中安装超级用户应用程序.我只是想添加我的应用程序以获得root访问权限.我怎样才能做到这一点?
我浏览了path system/extras/su中的su.c文件但是我无法理解整个代码.
当我查看代码时,我认为如果我可以modify su.c来提供对我的应用程序的root访问权限,那么我的目标就可以实现compile it and add the binary.我对吗?
我实际上丢失了我的root密码,我需要更改它.我按照以下步骤操作:
步骤#1:停止MySQL服务器进程.
步骤#2:使用--skip-grant-tables选项启动MySQL(mysqld)服务器/守护程序进程,以便它不会提示输入密码.
步骤#3:以root用户身份连接MySQL服务器.
我们可以在这些网站上找到:https://www.howtoforge.com/setting-changing-resetting-mysql-root-passwords#recover-mysql-root-password
mysql> use mysql;
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD("TOOR");
mysql> flush privileges;
mysql> quit
Run Code Online (Sandbox Code Playgroud)
第一个错误,所以我试过:
mysql> use mysql;
mysql> update user set password=PASSWORD("TOOR") where User='root';
mysql> flush privileges;
mysql> quit
Run Code Online (Sandbox Code Playgroud)
总是同样的错误说:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near '("TOO
R") WHERE User='root'' at line 1
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
启动后,我希望我的Linux程序删除root权限并切换到非特权帐户.我在网上找到了各种各样的例子,但对我的要求没有任何规范,特别是:
我发现的最好方法是:
uid_t new_uid = ...;
gid_t new_gid = ...;
gid_t rgid, egid, sgid;
if (setresgid(new_gid, new_gid, new_gid) < 0)
{
perror("setresgid");
exit(EXIT_FAILURE);
}
if (getresgid(&rgid, &egid, &sgid) < 0)
{
perror("getresgid");
exit(EXIT_FAILURE);
}
if (rgid != new_gid || egid != new_gid || sgid != new_gid)
{
printf("unexpected gid");
exit(EXIT_FAILURE);
}
if (setgroups(0, 0) != 0)
{
perror("setgroups");
exit(EXIT_FAILURE);
}
uid_t ruid, euid, suid;
if (setresuid(new_uid, new_uid, new_uid) < 0)
{
perror("setresuid");
exit(EXIT_FAILURE);
}
if …Run Code Online (Sandbox Code Playgroud) 我最近开始使用Jenkins进行集成.一切顺利,直到我在没有shell命令的主节点上运行作业,但我必须在master和slave节点上运行包含shell命令的作业.我无法以root用户身份运行这些shell命令.我试过了
SSH Keys. sudo.permission denied每次使用上述任何一种方法时都会出错.