我的团队正在将Python 2.4.4运行时合并到我们的项目中,以便利用一些外部开发的功能.
我们的平台具有450Mhz SH4应用程序核心和有限的内存,供Python运行时和应用程序使用.
我们移植了Python,但初步测试突出了以下障碍:
a)Python运行时的启动时间可能低至25秒(导入相关库时,依次导入其依赖项)
b)Python似乎永远不会在垃圾收集期间向操作系统释放内存 - 唯一的办法是关闭运行时并重新启动(导致上面提到的启动延迟,这通常是不切实际的)
如果我们可以缓解这些问题,我们将大大改进Python的使用.SO社区的任何指导都非常有价值.尤其是那些了解Python执行引擎如何运行的内在知识的人.
我制作了一个用于图形的小tkinter游戏turtle。它是对来自 Cracker Barrel 的 Triangle Peg Game 的模拟,能够告诉玩家在游戏中的任何时间点的下一个最佳移动,以及其他功能。Pegs 只是 的一个子类的实例turtle.RawPen,我保留了很多普通的RawPenaround实例来绘制代表移动的箭头。
我注意到当我重新启动游戏(调用turtle.bye())以杀死海龟窗口时,内存消耗实际上增加了,因为海龟似乎没有被删除。即使我window.clear()事先调用,清除_turtles了window.__dict__,仍然有对海龟的引用。我确保在重新启动期间删除了我对它们的所有引用,所以这不是问题。有没有办法真正删除乌龟,以便它可以被垃圾收集?
我正在使用带有 gunicorn 的 Flask,我的配置文件如下所示:
timeout = 30
limit_request_line = 6000
max_requests = 500 # restart worker after this many requests
max_requests_jitter = 100
preload_app = True
workers = 2
Run Code Online (Sandbox Code Playgroud)
使用两个同步工作者和预分叉,我希望我的大部分应用程序代码在分叉之前加载到父进程中。但是我注意到在我执行前几个请求后,两个工作进程的内存使用量大幅增加。
我试图找到任何可以在“运行时”加载的东西,而不是在烧瓶应用程序设置时加载,但我找不到任何东西。我已经尝试广泛使用 memory_profiler,但还没有提出任何有用的数据。我什至尝试确保我的应用程序、模型和视图在分叉之前确实已加载:
def pre_fork(server, worker):
print(f"PRE-FORK {server} {worker}")
import myapp.views
Run Code Online (Sandbox Code Playgroud)
虽然我可以看到它被调用并加载了我的所有视图(就应用程序而言,它应该加载基本上所有的东西),但它没有区别。我该怎么做才能找出导致工作进程中第一个请求消耗大量内存的原因?在第一次请求之后内存使用非常稳定和平坦,所以我认为没有持续的泄漏。我只想找出在 fork 之前没有加载和没有共享的内容。
我的主要问题是:当第一个请求进入可能将额外位加载到内存中的工作人员时,Flask 正在做什么额外的工作?
当我将文件加载到json中时,pythons将内存使用量激增至约1.8GB,我似乎无法释放该内存.我整理了一个非常简单的测试用例:
with open("test_file.json", 'r') as f:
j = json.load(f)
Run Code Online (Sandbox Code Playgroud)
很抱歉我无法提供示例json文件,我的测试文件有很多敏感信息,但对于上下文,我正在处理240MB的文件.运行上面的2行后,我使用了前面提到的1.8GB内存.如果我然后做del j内存使用不会下降.如果我跟着它,gc.collect()它仍然不会下降.我甚至尝试卸载json模块并运行另一个gc.collect.
我正在尝试运行一些内存分析,但是堆积已经搅拌了100%的CPU大约一个小时,现在还没有产生任何输出.
有没有人有任何想法?我也尝试过使用cjson而不是打包的json模块.cjson使用的内存减少了约30%但显示完全相同的问题.
我在Ubuntu服务器11.10上运行Python 2.7.2.
我很高兴加载任何内存分析器,看看它是否比堆更好,并提供您认为必要的任何诊断.我正在寻找一个大型测试json文件,我可以为其他任何人提供它.
我有一个Python2.7应用程序,它使用了大量dict包含键和值字符串的对象.
有时这些dicts和字符串不再需要了,我想从记忆中删除那些.
我尝试不同的东西,del dict[key],del dict,等,但应用程序仍然使用相同的内存量.
下面是一个我希望收取内存的例子.但它没有:(
import gc
import resource
def mem():
print('Memory usage : % 2.2f MB' % round(
resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024.0/1024.0,1)
)
mem()
print('...creating list of dicts...')
n = 10000
l = []
for i in xrange(n):
a = 1000*'a'
b = 1000*'b'
l.append({ 'a' : a, 'b' : b })
mem()
print('...deleting list items...')
for i in xrange(n):
l.pop(0)
mem()
print('GC collected objects : %d' % gc.collect())
mem()
Run Code Online (Sandbox Code Playgroud)
输出:
Memory usage : 4.30 …Run Code Online (Sandbox Code Playgroud) python memory garbage-collection memory-management python-2.7
请考虑以下代码:
import numpy as np
a = np.zeros(50)
a[10:20:2] = 1
b = c = a[10:40:4]
print b.flags # You'll see that b and c are not C_CONTIGUOUS or F_CONTIGUOUS
Run Code Online (Sandbox Code Playgroud)
我的问题:
有没有办法(只有参考b)来制作b和c连续?如果在此操作之后np.may_share_memory(b,a)返回,则完全正常False.
接近但不太合理的事情是: np.ascontiguousarray/ np.asfortranarray因为它们会返回一个新阵列.
我的用例是我有一个非常大的3D字段存储在a的子类中numpy.ndarray.为了节省内存,我想将这些字段切换到我实际感兴趣处理的域的部分:
a = a[ix1:ix2,iy1:iy2,iz1:iz2]
Run Code Online (Sandbox Code Playgroud)
对子类进行切片比切片ndarray对象更受限制,但这应该有效,它将"做正确的事" - 子类上附加的各种自定义元数据将按预期进行转换/保留.不幸的是,由于这会返回a view,numpy之后不会释放大数组,所以我实际上并没有在这里保存任何内存.
要完全清楚,我希望完成两件事:
我正在用Python创建一个涉及散列密码的程序.假设我使用它来获取密码:
import getpass
password = getpass.getpass("Password: ")
Run Code Online (Sandbox Code Playgroud)
然后散列它,有没有办法从RAM中安全地删除所有未散列密码的痕迹?
我读到可以使用手动收集垃圾
gc.collect()
Run Code Online (Sandbox Code Playgroud)
现在我想知道什么时候这样做有用。我想它在某种程度上是通用的 Python 逻辑。假设我有一个大循环,并且在每个循环中都会使用大矩阵Z并一次又一次地重写它们。如果我不改变 的大小,最后删除矩阵并收集垃圾有用Z吗?
一般问题在什么情况下可以真正观察到强制垃圾收集的影响,尤其是在进行大量数值计算时numpy?
所以我一直在研究10k +页面上的刮刀并从中抓取数据.
问题是随着时间的推移,内存消耗急剧增加.因此,为了克服这一点而不是仅在scrape scraper结束时关闭驱动程序实例,因此它会在每个页面加载并提取数据后关闭实例.
但由于某种原因,ram记忆仍然存在.
我尝试使用PhantomJS但由于某种原因它没有正确加载数据.我还尝试使用初始版本的scraper将Firefox中的缓存限制为100mb,这也不起作用.
注意:我使用chromedriver和firefox实例运行测试,不幸的是我不能使用诸如请求,机械化等库来代替selenium.
任何帮助都表示赞赏,因为我一直试图解决这个问题一周.谢谢.
python firefox selenium selenium-chromedriver selenium-webdriver
我有一个非常大的表需要计算(100亿+行)。一次计算所有这些时间太长。因此,我创建了一个断点列表,并在每个步骤的末尾进行计算和存储。但是,每个步骤花费更长的时间。我认为原因是内存或缓存,您是否知道在这种情况下该如何处理,或者只是如何清除缓存或内存?
我将变量重用于循环中的输出,因此变量不会变得越来越大。
非常感谢。
python ×10
memory ×3
numpy ×2
caching ×1
embedded ×1
firefox ×1
flask ×1
gunicorn ×1
hashlib ×1
json ×1
memory-leaks ×1
performance ×1
python-2.7 ×1
python-3.x ×1
scipy ×1
security ×1
selenium ×1