当前位置: 首页 > 面试题库 >

Python内存优化技巧

沈单弓
2023-03-14
问题内容

我需要优化应用程序的RAM使用率。
请避免让我的讲座告诉我在编写Python时我不关心内存。我有一个内存问题,因为我使用了很大的默认字典(是的,我也想很快)。我当前的内存消耗为350MB,并且还在不断增长。我已经不能使用共享主机了,如果我的Apache打开更多进程,内存将增加两倍和三倍……这很昂贵。
我已经进行了 广泛的分析, 而且我确切地知道了问题所在。
我有几个带有Unicode键的大型(>
100K条目)字典。字典从140字节开始并迅速增长,但是更大的问题是密钥。Python优化了内存中的字符串(或者我已经读过),以便查找可以是ID比较(“
intern”它们)。不确定unicode字符串也是如此(我无法“实习”它们)。
存储在字典中的对象是元组列表(an_object,一个int,一个int)。

my_big_dict [some_unicode_string] .append((my_object,an_int,another_int))

我已经发现分割成几本字典是值得的,因为元组占用了大量空间…
我发现我可以通过在将字符串用作键之前对字符串进行哈希处理来节省RAM!但是,可悲的是,我在32位系统上遇到了生日冲突。(旁边的问题:我可以在32位系统上使用64位密钥字典吗?)

在Linux(生产)和Windows上都使用Python 2.6.5。关于优化字典/列表/元组的内存使用的任何技巧?我什至想到使用C-
我不在乎这小段代码是否丑陋。这只是一个单一的位置。

提前致谢!


问题答案:

我建议如下:将所有值存储在数据库中,并保留一个以字符串哈希为键的内存字典。如果发生冲突,请从数据库中获取值,否则(大多数情况下)使用字典。实际上,它将是一个巨大的缓存。

Python中的字典存在一个问题,即它们占用了大量空间:即使int-int字典在32位系统上每个键值对也使用 45-80字节
。同时,每对intarray.array('i')仅使用 8个字节 ,并且通过少量记账就可以实现基于数组的 int→int
字典的合理快速运行。

一旦有了内存效率高的int-int字典实现,就将您的 字符串→(对象,int,int) 字典分成三个字典,并使用哈希代替完整的字符串。您将获得一个
int→对象 和两个 int→int 字典。模仿 int→对象 字典,如下所示:保留对象列表并将对象的索引存储为 int→int 字典的值。

我的确意识到要获得基于数组的字典需要涉及大量的编码。我遇到了与您类似的问题,并且实现了一个相当快,内存效率很高的通用hash-int字典。
这是我的代码(BSD许可证)。它是基于数组的(每对8个字节),它负责密钥散列和冲突检查,它在写入过程中使数组(实际上是几个较小的数组)保持有序,并在读取时进行二进制搜索。您的代码简化为:

dictionary = HashIntDict(checking = HashIntDict.CHK_SHOUTING)
# ...
database.store(k, v)
try:
    dictionary[k] = v
except CollisionError:
    pass
# ...
try:
    v = dictionary[k]
except CollisionError:
    v = database.fetch(k)

checking参数指定发生冲突时发生的情况:在读取和写入时CHK_SHOUTING提高,CollisionError在读取时CHK_DELETING返回None,并且在写入时保持沉默,CHK_IGNORING不进行冲突检查。

接下来是对我的实现的简要说明,欢迎使用优化提示!顶层数据结构是数组的常规字典。每个数组最多包含2^16 = 65536整数对(的平方根2^32)。键k和对应的值v都存储在k/65536-th数组中。数组按需初始化,并按键保持顺序。每次读取和写入都会执行二进制搜索。冲突检查是一个选项。如果启用,尝试覆盖现有键的操作将从字典中删除键和关联的值,将该键添加到一组冲突键中,并且(再次可选)引发异常。



 类似资料:
  • 本文向大家介绍Python性能优化技巧,包括了Python性能优化技巧的使用技巧和注意事项,需要的朋友参考一下 Python是一门非常酷的语言,因为很少的Python代码可以在短时间内做很多事情,并且,Python很容易就能支持多任务和多重处理。 py   1、关键代码可以依赖于扩展包 Python使许多编程任务变得简单,但是对于很关键的任务并不总是提供最好的性能。使用C、C++或者机器语言扩展包

  • 不是内存泄漏或类似的问题,因为第一次连接后内存使用量不会增加,所以优化可能是加载更少的模块或做一些不同的事情...

  • 今天,很多网站的 URL 的设计都是有问题的——因为 RESTful。依据 RESTful API 原则,我们设计出来的 API 的 URL 都会有这样那样的缺陷。 在过去的几年里,搜索引擎的影响力发生了一些变化——其影响力的趋势是逐渐变弱。应用程序已经变成了流量的一个大入口,当然搜索引擎也还是一个大的 入口。搜索引擎优化看上去并没有那么重要,企业靠活动、运营来挖掘新的用户。可当所有的人不重视,而

  • 本文向大家介绍总结Android App内存优化之图片优化,包括了总结Android App内存优化之图片优化的使用技巧和注意事项,需要的朋友参考一下 前言 在Android设备内存动不动就上G的情况下,的确没有必要去太在意APP对Android系统内存的消耗,但在实际工作中我做的是教育类的小学APP,APP中的按钮、背景、动画变换基本上全是图片,在2K屏上(分辨率2048*1536)一张背景图片

  • 本文向大家介绍Redis 如何做内存优化?相关面试题,主要包含被问及Redis 如何做内存优化?时的应答技巧和注意事项,需要的朋友参考一下 尽量使用 Redis 的散列表,把相关的信息放到散列表里面存储,而不是把每个字段单独存储,这样可以有效的减少内存使用。比如将 Web 系统的用户对象,应该放到散列表里面再整体存储到 Redis,而不是把用户的姓名、年龄、密码、邮箱等字段分别设置 key 进行存

  • 本文向大家介绍Mysql IO 内存方面的优化,包括了Mysql IO 内存方面的优化的使用技巧和注意事项,需要的朋友参考一下 这里使用的是mysql Ver 14.14 Distrib 5.6.19, for Linux (i686) using EditLine wrapper 一、mysql目录文件 ibdata1:系统表空间 包含数据字典、回滚日志/undolog等 (insert buf