`
vvggsky
  • 浏览: 66877 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

位图存储优化

阅读更多
位图作为一种简高效使用内存的数据结构,在很多场合都能够用最省的内存表达大量的数据。我对位图最早的印象来自于《编程珠玑》中用位图结构来存储电话号码。感叹其简单、方便。本质上,位图是一个存储单个位的数组,每一个位表示一个数组元素。例如如果我们需要标记100万用户的在线状态,则可以将每个用户对应到一个位,只需要100万个位(约0.125M内存)的位图就可以表示了。如下图所示,在线的用户标记为绿色。其存储则可表示为 {01010011 0011…}。





但是对于某些比较稀疏的位图,其存储效率也会有一些问题。如果100万用户平均只有100个人在线,那另外的999,900个位就浪费掉了。例如在第1位有一个用户,第1,000,000位有个用户,需要1M个位来保存。既浪费了存储空间,也带来大量无用的运算。在前不久我们的应用中就有这种问题。未经压缩的位图保存到数据库中,结果大量的IO操作对数据库的性能造成较大影响。

因为稀疏的位图比较多,比较直接地就想去掉中间的这些空白位,于是就想这样表示:存储第一个位的值(0或1),接着将接下来的所有值相同的位的数目保存为一个整数,再保存接下来另的一类连续位的数目,依此类推。如:{0000 0000 1000 0000 0000 1100 0001 0000 …… } 保存为 0,7,1,11,2,5…。 如果是一百万个位,只有第一个和最后一个是1{10000 …. …. 1},则保存为{1,999998,1}只需要三个整数就可以了!(注:实际上,早有人完整地将这种方法实现了,参考D-Gap Compression)

于是对比较稀疏的位图应用这种方法,由于大部分位图都是比较稀疏,90%以上的位图的体积最终缩小了10倍。在测试过程中,发现最终存储的是大量的小整数(小于1000)。这些小整数其实可以用更短的类型来表示,于是应用变长编码来处理。其原理是每一个字节的高位做标识,其余7位存储值。1标识从这个字节开始是一个新的整数,0表示是上一个字节的延续。则区间[1, 2^7 )中的整数占用一个字节,[2^7, 2^14)中的整数占用两个字节,依次类推。

最终,90%以上的位图体积压缩了30倍以上。
  • 大小: 1.2 KB
分享到:
评论

相关推荐

    基于双向位图的CSR大规模图存储优化.docx

    不同的稀疏矩阵存储格式在效率、灵活性、可扩展性和适用场景上各有优劣,而Bi-CSR在这种背景下脱颖而出,展示了其在存储优化和性能提升方面的优势。 综上所述,本文通过对双向位图的稀疏矩阵压缩存储方法Bi-CSR的...

    Oracle表字段更新存储过程效率优化思路

    本文将深入探讨Oracle表字段更新的存储过程效率优化思路,以及优化后可能带来的性能提升。 首先,理解存储过程的执行原理是优化的基础。存储过程在创建时会被编译成优化器可以理解的执行计划。这个计划会保存在...

    mcgs中的位图优化

    1. **位图格式选择**:不同的位图格式如BMP、JPEG、PNG等,它们在存储和显示上存在差异。BMP格式通常占用空间较大,但无需解压,适合静态背景;JPEG适合连续色调的图片,有较好的压缩效果;PNG支持透明,适用于需要...

    将24位位图转换成16位位图的源码

    在图像处理领域,位图(Bitmap)是一种常见的图像文件格式,它存储了图像的像素颜色信息。24位位图和16位位图是两种不同的位深度表示,位深度决定了一个像素可以表示的颜色数量。24位位图通常包含三个颜色通道(红、...

    C语言实现的文件存储引擎

    通过指针操作和内存管理,开发者可以精确地控制数据的读写过程,从而优化存储效率。 在高级编程思想方面,可能包括以下几个方面: 1. **设计模式**:文件存储引擎可能采用了如工厂模式、单例模式、观察者模式等...

    简单的位图资源

    9. **优化位图资源**:为了减小程序大小和提高加载速度,可以考虑对位图进行压缩,或者使用位图精灵(Sprite)技术,将多个小图合并成一张大图,只加载一次,然后通过坐标定位来显示不同的部分。 10. **位图在UI...

    三种位图的常见方法,深入分析位图结构

    位图(Bitmap)是计算机图形学中常见的图像文件格式,广泛应用于各种操作系统和应用程序中。本文将深入探讨位图的结构,并介绍三种...通过灵活运用这些知识,我们可以有效地处理和优化位图文件,提高存储和传输效率。

    24位图转16位图工具

    在实际应用中,这种转换可能用于节省存储空间、优化加载速度,或者是为了适应某些硬件或软件的限制。例如,在游戏开发中,为了降低内存占用和提升渲染效率,开发者可能会选择使用16位图像;在移动设备或嵌入式系统中...

    ORACLE四招提高位图索引

    本文将探讨如何通过四个策略来优化位图索引的使用。 首先,我们需要理解何时适合使用位图索引。位图索引通常适用于那些具有少量重复值的列,例如性别、民族或出生地等。如果基数小于表记录总数的2%,或者字段内容...

    android中的位图操作demo

    7. **内存缓存和磁盘缓存**:为了提高性能,开发者可以将常用的位图存储在内存或磁盘缓存中。`LruCache`是Android提供的内存缓存机制,而`DiskLruCache`则用于磁盘缓存。不过,Android P及更高版本推荐使用`...

    位图浏览器

    这些库能够快速地执行位运算、色彩空间转换等操作,同时优化了性能,使得位图的处理变得快速且流畅。 至于文件"PictureAutoSize",可能是位图浏览器中的一个配置文件,用于保存用户自定义的图像自动适应设置,或者...

    各种精美位图素材

    同时,位图素材的质量(分辨率和文件大小)也需要根据用途和平台进行优化,以确保在不影响视觉效果的前提下,减少加载时间和存储空间。 在版权方面,使用位图素材时需要注意素材的来源和许可,避免侵犯他人的知识...

    位图图片资源

    5. **优化与压缩**:为了减小位图文件大小,可以使用各种优化技术,如压缩算法、减少颜色深度、去除无用的元数据等。这些方法能在保持图像质量的同时,加快加载速度,节省存储空间。 6. **版权问题**:在使用位图...

    位图的打开显示保存

    - 分配内存空间用于存储位图信息头和像素数据。 - 读取位图信息头和像素数据。 ```cpp // 从位图文件中读取与位图文件头大小的字节到文件头变量中 UINT bitmapFileHeaderSize = dibFile.Read((void*)&...

    数据库表中位图字段记录添加方法

    在数据库设计中,有时我们需要存储图像或者其他非结构化数据,如照片、图表等。在这种情况下,位图(Bitmap)字段就派上了用场。...在设计数据库时,根据实际需求来决定是否使用位图字段以及如何优化其使用。

    bitmap switcher 位图转换

    Bitmap Switcher是一款用于进行位图格式转换的工具,支持多种位深度的图像处理...无论是为了优化文件大小、适应特定设备还是满足特定的显示需求,了解并掌握位图位深度的相关知识都是图像处理过程中不可或缺的一部分。

    几个位图资源

    5. **性能优化**:学习如何优化位图操作,减少不必要的计算,以提高游戏运行效率。 6. **内存管理**:理解如何有效地加载和释放位图资源,避免内存泄漏。 7. **图形库使用**:深入研究并熟悉至少一个图形库,如SDL...

    位图菜单的原代码资源

    位图是一种像素图像格式,可以存储各种颜色和细节,因此非常适合用来创建具有视觉吸引力的菜单项。在位图菜单中,每个菜单项通常对应一个位图图像,当用户点击这个图像时,会触发相应的操作或功能。 位图菜单的实现...

    VC写图片,位图的创建与保存

    在计算机图形学中,位图(Bitmap)是一种存储图像的方式,其基本单位是像素点。在本篇内容中,我们将深入探讨一个具体的示例代码,该代码展示了如何在VC++环境下进行位图的创建与保存。该示例包含了四个关键函数,...

Global site tag (gtag.js) - Google Analytics