- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我明白,以我的方式查询 defaultdict 中不存在的键会将项目添加到 defaultdict。这就是为什么在性能方面将我的第二个代码片段与我的第一个代码片段进行比较是公平的。
import numpy as num
from collections import defaultdict
topKeys = range(16384)
keys = range(8192)
table = dict((k,defaultdict(int)) for k in topKeys)
dat = num.zeros((16384,8192), dtype="int32")
print "looping begins"
#how much memory should this use? I think it shouldn't use more that a few
#times the memory required to hold (16384*8192) int32's (512 mb), but
#it uses 11 GB!
for k in topKeys:
for j in keys:
dat[k,j] = table[k][j]
print "done"
这里发生了什么?此外,与第一个脚本相比,这个类似的脚本需要 eon 来运行,并且还使用了荒谬的内存量。
topKeys = range(16384)
keys = range(8192)
table = [(j,0) for k in topKeys for j in keys]
我猜 python 整数可能是 64 位整数,这可以解释其中的一部分,但是这些相对自然和简单的构造真的会产生如此巨大的开销吗?我猜这些脚本表明它们确实如此,所以我的问题是:究竟是什么导致了第一个脚本中的高内存使用以及第二个脚本的长时间运行和高内存使用,有什么办法可以避免这些成本?
编辑:64 位机器上的 Python 2.6.4。
编辑 2:我知道为什么,大致上,我的表应该占用 3 GB16384*8192*(12+12) 字节 和 6GB 的 defaultdict 负载因子强制它保留双倍的空间。然后内存分配效率低下又消耗了 2 个因素。
所以这是我剩下的问题:有没有办法告诉它以某种方式使用 32 位整数?
与第一个相比,为什么我的第二个代码片段需要 FOREVER 才能运行?第一个大约需要一分钟,我在 80 分钟后杀死了第二个。
最佳答案
Python int 在内部表示为 C longs(实际上比这更复杂一些),但这并不是问题的根源。
最大的开销是你对字典的使用。 (在这个描述中,defaultdicts 和 dicts 大致相同)。 dicts 是使用哈希表实现的,这很好,因为它可以快速查找非常通用的键。 (当您只需要查找连续的数字键时,就没有那么必要了,因为它们可以以一种简单的方式进行布局。)
一个字典可以有比它拥有的项目更多的插槽。假设您有一个 dict,其插槽数是项目数的 3 倍。这些插槽中的每一个都需要空间来容纳指向键的指针和用作链表末尾的指针。这是数字的 6 倍,加上指向您感兴趣的项目的所有指针。考虑到这些指针中的每一个在您的系统上都是 8 个字节,并且在这种情况下您有 16384 个默认字典。粗略地看一下,16384 次出现 *(8192 项/出现)*7(指针/项)*8(字节/指针)= 7 GB
。这是在我得到你正在存储的 实际数字(每个唯一数字本身就是一个 Python 字典)、外部字典、那个 numpy 数组或 Python 跟踪的东西之前尝试优化一些。
您的开销听起来比我怀疑的要高一些,我很想知道 11GB 是用于整个进程还是仅用于表计算。无论如何,我确实希望这个 dict-of-defaultdicts 数据结构的大小比 numpy 数组表示大几个数量级。
至于“有什么办法可以避免这些费用?”答案是“使用 numpy 存储大型、固定大小的连续数字数组,而不是字典!”您必须更具体、更具体地说明为什么您发现这样的结构对于更好地建议最佳解决方案是必要的。
关于python - 为什么 defaultdict(int) 的 dicts 使用这么多内存? (以及其他简单的 python 性能问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2747511/
我正在努力实现以下目标, 假设我有字符串: ( z ) ( A ( z ) ( A ( z ) ( A ( z ) ( A ( z ) ( A ) ) ) ) ) 我想编写一个正则
给定: 1 2 3 4 5 6
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
大家好,我卡颂。 Svelte问世很久了,一直想写一篇好懂的原理分析文章,拖了这么久终于写了。 本文会围绕一张流程图和两个Demo讲解,正确的食用方式是用电脑打开本文,跟着流程图、Demo一
身份证为15位或者18位,15位的全为数字,18位的前17位为数字,最后一位为数字或者大写字母”X“。 与之匹配的正则表达式: ?
我们先来最简单的,网页的登录窗口; 不过开始之前,大家先下载jquery的插件 本人习惯用了vs2008来做网页了,先添加一个空白页 这是最简单的的做法。。。先在body里面插入 <
1、MySQL自带的压力测试工具 Mysqlslap mysqlslap是mysql自带的基准测试工具,该工具查询数据,语法简单,灵活容易使用.该工具可以模拟多个客户端同时并发的向服务器发出
前言 今天大姚给大家分享一款.NET开源(MIT License)、免费、简单、实用的数据库文档(字典)生成工具,该工具支持CHM、Word、Excel、PDF、Html、XML、Markdown等
Go语言语法类似于C语言,因此熟悉C语言及其派生语言( C++、 C#、Objective-C 等)的人都会迅速熟悉这门语言。 C语言的有些语法会让代码可读性降低甚至发生歧义。Go语言在C语言的
我正在使用快速将 mkv 转换为 mp4 ffmpeg 命令 ffmpeg -i test.mkv -vcodec copy -acodec copy new.mp4 但不适用于任何 mkv 文件,当
我想计算我的工作簿中的工作表数量,然后从总数中减去特定的工作表。我错过了什么?这给了我一个对象错误: wsCount = ThisWorkbook.Sheets.Count - ThisWorkboo
我有一个 perl 文件,用于查看文件夹中是否存在 ini。如果是,它会从中读取,如果不是,它会根据我为它制作的模板创建一个。 我在 ini 部分使用 Config::Simple。 我的问题是,如果
尝试让一个 ViewController 通过标准 Cocoa 通知与另一个 ViewController 进行通信。 编写了一个简单的测试用例。在我最初的 VC 中,我将以下内容添加到 viewDi
我正在绘制高程剖面图,显示沿路径的高程增益/损失,类似于下面的: Sample Elevation Profile with hand-placed labels http://img38.image
嗨,所以我需要做的是最终让 regStart 和 regPage 根据点击事件交替可见性,我不太担心编写 JavaScript 函数,但我根本无法让我的 regPage 首先隐藏。这是我的代码。请简单
我有一个非常简单的程序来测量一个函数花费了多少时间。 #include #include #include struct Foo { void addSample(uint64_t s)
我需要为 JavaScript 制作简单的 C# BitConverter。我做了一个简单的BitConverter class BitConverter{ constructor(){} GetBy
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我是 Simple.Data 的新手。但我很难找到如何进行“分组依据”。 我想要的是非常基本的。 表格看起来像: +________+ | cards | +________+ | id |
我现在正在开发一个 JS UDF,它看起来遵循编码。 通常情况下,由于循环计数为 2,Alert Msg 会出现两次。我想要的是即使循环计数为 3,Alert Msg 也只会出现一次。任何想法都
我是一名优秀的程序员,十分优秀!