这个故事是关于我们最近在Plumbr进行的容量优化任务。 一切始于将无害的要求添加到现有组合中。

如您所知,Plumbr监视解决方案作为连接到服务器的Java代理分发。 只需少量添加即可跟踪一段时间内所有已连接的代理,以便可以实时回答以下问题:

  • 我们有多久没有收到这个特定JVM的消息了?
  • 另一个JVM的最后一次已知停机时间是什么?

当每个代理每秒发送一次心跳时,我们在服务器端需要做的就是跟踪所有心跳。 由于每个心跳都附加有唯一的时间戳记,因此天真的解决方案就像将Set或Map中的所有心跳都扔掉一样容易。 那么-简单,完成,接下来,请?

但是,一些快速的数学运算表明,最初的想法可能行不通。 考虑到:

  • 时间戳记的类型很长 ,需要8个字节才能容纳它自己
  • 一年中有365 x 24 x 60 x 60 = 31,536,000秒

我们可以快速进行数学计算,发现单个JVM仅使用一年原始数据就需要240MB 。 仅原始数据的大小就已经足够吓人了,但是当打包到HashSet时,结构的保留大小 激增至约2GB ,而所有开销java.util.Collection API实现都隐藏在它们的腹部 。

幼稚的解决方案已经无法解决,我们需要一个替代方案。 最初我们不必走得很远,因为在同一java.util包中,一个等待被发现的意外之举叫java.util.BitSet 。 根据该类的javadoc:

BitSet类实现一个按需增长的位向量。 位集合的每个分量都有一个布尔值。 BitSet的位由非负整数索引。 可以检查,设置或清除各个索引位。

那么,如果我们将从代理获取的心跳存储为由心跳时间戳记索引的布尔值,该怎么办? Java中的时间戳表示为当前时间与1970年1月1日UTC午夜之间的毫秒差。 知道这一点后,我们可以将UTC表示为2015年9月1日12:00 UTC,即数字1441108800。那么,如果当我们看到一个Agent在时间戳1441108800处向我们发送心跳信号时,我们会将带有索引1441108800的位设置为true ,否则被保留为默认false

解决方案的问题隐藏在一个事实中,即BitSet中的位是用整数而不是long索引的。 要继续执行此解决方案,我们将需要一种将整数映射到long而不丢失任何信息的方法。 如果似乎不可能,那么让我们回顾一下这样一个事实,即需要一秒而不是一毫秒的精度。 知道了这一点,我们可以将索引缩小1,000倍,并以秒而不是毫秒的精度标记时间。

但是仅使用整数就可以表示多少秒? 显然,Integer.MAX_VALUE足够大,可以表示从1970年1月1日到19.01.2038的每一秒。 除了制造2038年的问题外,它还应该足够好,对吗?

不幸的是,正如我们的餐巾纸计算所显示的那样,一年的数据价值仍需要约800MB的堆空间。 这是从原始HashSet的2GB向正确方向迈出的一小步,但对于实际使用而言仍然太多了。

为了克服该问题,可能需要重新阅读/重新考虑“足以代表1970年1月1日的每一秒”的部分。 (不幸的)先生。 直到1995年,高斯林才发明Java虚拟机。18年后,Plumbr看到了曙光。 因此,我们直到1970年才需要回顾历史,并且每个整数都有一堆零。 可以从01.01.2013开始,而不是从01.01.1970开始,并使用一个索引0对应于01.01.2013 00:00(UTC)。

重做我们的餐巾纸数学,并在实践中检查结果使我们成为赢家。 现在一年的数据量只能存储在20MB中 。 与原始2GB相比,我们将所需容量减少了100倍 。 由于现有的基础架构已经可以解决这个问题,因此已经处于舒适区域,因此我们没有在优化路径上走得更远。

故事的道德启示? 当您有需求时,请找出对应用程序性能的影响。 我的意思是性能的各个方面,因为不仅有延迟和吞吐量,还应该忘记容量。 并且–了解您的域名。 没有它,您将无法做出决策,如果仅仅配备了有关数据结构的智能书籍,这些决策就显得不安全且危险。

翻译自: https://www.javacodegeeks.com/2015/09/squeezing-data-into-the-data-structure.html

将数据压缩到数据结构中相关推荐

  1. 数据结构压缩_将数据压缩到数据结构中

    数据结构压缩 这个故事是关于我们最近在Plumbr进行的容量优化任务. 一切始于将无害的要求添加到现有组合中. 您可能知道,Plumbr监视解决方案作为连接到服务器的Java代理分发. 只需少量添加即 ...

  2. 数据结构中等号表示什么_通过分析2016年最重要的252个中等故事我学到了什么...

    数据结构中等号表示什么 Medium may be struggling to find a sustainable business model, but they have years worth ...

  3. 图解:数据结构中的6种「树」,柠檬问你心中有数吗?

    数据结构这门课程是计算机相关专业的基础课,数据结构指的是数据在计算机中的存储.组织方式. 我们在学习数据结构时候,会遇到各种各样的基础数据结构,比如堆栈.队列.数组.链表.树...这些基本的数据结构类 ...

  4. 数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)

    原文:http://blog.csdn.net/sup_heaven/article/details/39313731 数据结构中常见的树(BST二叉搜索树.AVL平衡二叉树.RBT红黑树.B-树.B ...

  5. gsoap中的数据结构中不允许有野指针

    2019独角兽企业重金招聘Python工程师标准>>> gsoap中的数据结构中不允许有野指针,比如char *p,没有给它赋值,就必须要给其赋值为NULL. 转载于:https:/ ...

  6. 数据结构——数据结构中的数据表示

    1,本文介绍数据的概念,以便讨论数据结构究竟是什么: 2,程序设计的挑战: 1,利用计算机解决现实生活中的问题: 1,计算机顾名思义是其诞生的时候仅仅是给科学家使用,科学家用计算机进行计算: 2,这是 ...

  7. c语言折半查找递归程序,C语言数据结构中二分查找递归非递归实现并分析

    C语言数据结构中二分查找递归非递归实现并分析 前言: 二分查找在有序数列的查找过程中算法复杂度低,并且效率很高.因此较为受我们追捧.其实二分查找算法,是一个很经典的算法.但是呢,又容易写错.因为总是考 ...

  8. [数据结构]数据结构中各种树

    阅读目录 1. 二叉树 2. 二叉查找树 3. 平衡二叉树 3.1 平衡查找树之AVL树 3.2 平衡二叉树之红黑树 4. B树 5. B+树 6. B*树 7. Trie树 数据结构中有很多树的结构 ...

  9. 初始化栈的代码_数据结构中的栈,你知道多少?

    由于栈比较简单,也很容易理解,学过的人都知道一句话就可以描述栈的特性:后进先出.所以这篇文章主要是写如何使用代码来描述栈,当然也是让大家很容易理解的语言.还是先给出这篇文章的大致脉络. 首先,对栈有一 ...

最新文章

  1. TF之DD:利用Inception模型+GD算法生成带背景的大尺寸、高质量的Deep Dream图片——五个架构设计思维导图
  2. 关于V$OPEN_CURSOR
  3. linux系统下压缩文件,Linux系统下文件的压缩.打包与解压
  4. 将当前的head推送到远程_Git 通俗易懂系列 三、远程仓库和标签
  5. python 判断文件夹是否存在 否则创建
  6. php创建mysql分区_创建mysql表分区的方法_MySQL
  7. (转)CocosCreator零基础制作游戏《极限跳跃》五、制作游戏主场景背景滚动
  8. Datalogic得利捷扫码器助力生产与物流自动化!
  9. stc51单片机入门 c语言,STC51单片机入门(语言)
  10. 2021-08-1320210813SONY的专业DSD播放格式(DSF)转WAV的方法
  11. st7789 旋转_有没有人调过 ST7789V驱动的显示屏啊
  12. C++ QQ游戏 连连看外挂 内存挂入门
  13. PDM中BOM管理技术的研究及其应用
  14. 4选1数据选择器程序及testbench文件,给出仿真波形,分析
  15. mysql替换后的zzigu_MySQL导入数据报错Got a packet bigger than‘max_allowed_packet’bytes错误的解决方法...
  16. 量子计算机生命,量子计算机上量子人工生命模型 - 酷酷UFO
  17. 关于如何通过Swap函数交换两个变量的值
  18. MySQL 远程连接报“ SQL 执行错误 # 1130.
  19. hadoop开发环境配置
  20. 无锡有哪些高中有计算机专业,无锡19所重点高中大盘点!

热门文章

  1. java、sqlserver复习
  2. mybatis报错Type interface xxx.Dao is not known to the MapperRegistry
  3. 处理目录的常用命令---Linux
  4. java 读取svg元素_svg动态添加元素
  5. 在C语言的函数定义中 如果不需要返回结果,在C语言的函数定义中,如果不需要返回结果,就可以省略return语句...
  6. (转)构建微服务:Spring boot 入门篇
  7. java泛型程序设计——通配符类型+通配符的超类型限定
  8. 为wmi执行例外_称之为例外?
  9. wcf:rest_REST:管理多对多关系
  10. Infinispan版本已映射到最低Java版本