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

计算映射的内存占用量(或字节长度)

束高雅
2023-03-14
问题内容

我想将地图限制为最多X个字节。似乎没有直接的方法可以计算映射的字节长度。

"encoding/binary"package具有不错的Size功能,但仅适用于切片或“固定值”,不适用于地图。

我可以尝试从地图中获取所有键/值对,推断它们的类型(如果为map[string]interface{})并计算长度-
但这既麻烦又可能不正确(因为这会排除地图的“内部”运行成本)本身-管理指向元素的指针等)。

有建议的方式吗?最好是一个代码示例。


问题答案:

这是地图标题的定义:

// A header for a Go map.
type hmap struct {
    // Note: the format of the Hmap is encoded in ../../cmd/gc/reflect.c and
    // ../reflect/type.go.  Don't change this structure without also changing that code!
    count int // # live cells == size of map.  Must be first (used by len() builtin)
    flags uint32
    hash0 uint32 // hash seed
    B     uint8  // log_2 of # of buckets (can hold up to loadFactor * 2^B items)

    buckets    unsafe.Pointer // array of 2^B Buckets. may be nil if count==0.
    oldbuckets unsafe.Pointer // previous bucket array of half the size, non-nil only when growing
    nevacuate  uintptr        // progress counter for evacuation (buckets less than this have been evacuated)
}

计算其大小非常简单(unsafe.Sizeof)。

这是地图指向的每个单独存储区的定义:

// A bucket for a Go map.
type bmap struct {
    tophash [bucketCnt]uint8
    // Followed by bucketCnt keys and then bucketCnt values.
    // NOTE: packing all the keys together and then all the values together makes the
    // code a bit more complicated than alternating key/value/key/value/... but it allows
    // us to eliminate padding which would be needed for, e.g., map[int64]int8.
    // Followed by an overflow pointer.
}

bucketCnt 是一个常量,定义为:

bucketCnt     = 1 << bucketCntBits // equals decimal 8
bucketCntBits = 3

最终计算将为:

unsafe.Sizeof(hmap) + (len(theMap) * 8) + (len(theMap) * 8 * unsafe.Sizeof(x)) + (len(theMap) * 8 * unsafe.Sizeof(y))

theMap地图值在哪里,x是地图键类型y的值和地图值类型的值。

hmapthunk.s运行时类似,您必须通过组装与包共享结构。



 类似资料:
  • 系统调用在调用进程的虚拟地址空间中提供映射,将文件或设备映射到内存中。 下面是两种类型 - 文件映射或文件支持的映射 - 此映射将进程的虚拟内存区域映射到文件。 这意味着读取或写入这些内存区域会导致文件被读取或写入。这是默认的映射类型。 匿名映射 - 此映射映射进程的虚拟内存区域,不受任何文件的支持。 内容被初始化为零。 这种映射类似于动态内存分配(malloc()),在某些实现中用于某些分配。

  • 本文向大家介绍计算一个Java对象占用字节数的方法,包括了计算一个Java对象占用字节数的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了如何计算(或者说,估算)一个Java对象占用的内存数量的方法。分享给大家供大家参考。具体分析如下: 通常,我们谈论的堆内存使用的前提是以“一般情况”为背景的。不包括下面两种情形:   某些情况下,JVM根本就没有把Object放入堆中。例如:原则上讲

  • 【内存占用】页面主要展示项目运行过程中内存的使用情况,主要包括以下几个部分: 数据汇总 该项主要展示项目运行过程中的 “总内存峰值”、“堆内存峰值”、“GFX内存峰值” 和 “泄露风险”。其中,总内存为Unity引擎所统计的真实物理内存分配,并不包含系统缓存和第三方库的自身分配内存; 堆内存所指的是 Mono 管理和分配的托管堆内存; GFX内存为用于渲染的资源所占用的内存,主要包括纹理资源、网格

  • 本文向大家介绍Javascript 计算字符串在localStorage中所占字节数,包括了Javascript 计算字符串在localStorage中所占字节数的使用技巧和注意事项,需要的朋友参考一下 最近项目有个需求要用js计算一串字符串写入到localStorage里所占的内存,众所周知的,js是使用Unicode编码的。而Unicode的实现有N种,其中用的最多的就是UTF-8和UTF-1

  • 问题内容: 我是所有内存管理主题的新手,所以有很多我不了解的事情。 我正在尝试将图像缓存在我的应用程序中,但是我在内存消耗方面遇到了麻烦: 所有的Bitmap Chaching代码都可以从此处复制粘贴:http : //developer.android.com/training/displaying- bitmaps/index.html 我调试了代码,并在Eclipse的DDMS视图中检查了堆

  • 问题内容: 我收到[] byte类型的压缩ASCII文本字节。我面临的问题是,以下过程占用了很多内存,这些内存在函数到达其末尾后仍未释放,并在程序的整个运行期间保持占用状态。 我注意到正在使用的类型是并且此类型具有和函数,但是它们都不允许释放曾经占用的内存。 该文档的状态如下: 重置会将缓冲区重置为空,但会保留基础存储以供将来的写操作使用。重置与Truncate(0)相同。 如何取消设置缓冲区并再