外存

性能优化技巧:TopN

时光毁灭记忆、已成空白 提交于 2020-03-03 18:07:55
TopN是常见的运算,用SQL写出来是这样(以Oracle为例): select * from (select * from T order by x desc) where rownum<=N 这个SQL的运算逻辑从其语句上看,要先做排序(Order by),然后再取出前N条。 我们知道,排序是个非常慢的动作,复杂度很高(n*logn),如果涉及数据量大到内存放不下,那还需要进行内外存数据交换,性能还会急剧下降。 而事实上,要计算TopN,我们能设计出不需要全排序的算法,只要保持一个大小为N的小集合,对数据集遍历一次,将遍历过的数据的前N名保存在这个小集合中,遍历到新一条数据,如果比当前的第N名还大,则插入进去并丢掉现在的第N名,如果比当前的第N名要小,则不做动作。 这样计算的复杂度要低很多(n*logN,n是总数据条数),而且一般N都不大,可以在内存中放下,无论数据量有多大,都不会涉及内外存交换问题。 但是,SQL无法描述上面这个计算过程,这时,我们只能寄希望于数据库引擎是不是能自己优化。使用SPL就容易描述上面这个计算过程,从而实现高性能计算。 我们来测试一下看Oracle是不是会做这个优化,即用Oracle实现TopN后和SPL做同样运算相比。因为SPL能使用优化算法,如果Oracle的计算时间和SPL差不多,则说明它做了优化,如果差得很远,则可能是做了全排序。 一、

性能优化技巧:遍历复用提速多次分组

拈花ヽ惹草 提交于 2020-03-03 17:47:52
我们知道,大数据运算性能的瓶颈常常是在外存(也就是硬盘)IO上,因为外存访问性能要比内存低一两个数量级。因此,做性能优化时,减少硬盘的访问量有时要比减少CPU计算量更为重要。同一个任务,如果能使用硬盘访问量更少的算法,即使CPU计算量不变甚至略多一点,也会获得更好的性能。 分组汇总需要对数据集进行遍历。同一个数据集可能会按不同维度进行分组,这样原则上就要遍历多次,大数据时就会涉及多遍硬盘访问。但是,如果我们能在一次遍历过程中计算出多个维度的分组结果,那就会减少很多硬盘访问量。 可惜,SQL无法写出这样的运算(在遍历中返回多个分组结果),只能遍历多次,或者寄希望于数据库引擎是否能优化。而SPL则支持这种遍历复用的语法,可以一次遍历计算出多个分组结果,从而提高性能。 下面我们做一下测试,以Oracle为例看数据库是否会对多次遍历的计算进行优化,以及在SPL中采用遍历复用算法对性能的影响。 一、 数据准备和环境 SPL脚本生成数据文件,数据共两列,第一列id是小于20亿的随机整数,第二列amount是不大于1千万的随机实数。数据记录为80亿行,生成的原始文本文件大小为169G。利用数据库提供的数据导入工具将此文件数据导入到Oracle的数据表topn中,同时也用此文件数据生成SPL组表文件topn.ctx。 在一台Intel服务器上完成测试,2个Intel3014 CPU,主频1.7G

关于Linux,你应该了解哪些

旧时模样 提交于 2020-02-27 04:53:15
最有用系列: 《 Linux上,最常用的一批命令解析(10年精选)》 《Linux生产环境上,最常用的一套“vim“技巧》 《Linux生产环境上,最常用的一套“Sed“技巧》 《Linux生产环境上,最常用的一套“AWK“技巧》 《"Sed" 高级功能:我这小脑瓜都快绕晕了》 Linux 命令好像还真不少,根本原因就是软件多,也有像 ag 这样的命令想替代 grep ,但大多数命令古老而坚挺。不是因为这些软件设计的有多好,原因是一些软件最开始入驻了系统,时间久了,就变成了一种约定,这种习惯改变代价太大,就像把所有键盘的 L 和 F 换一下一样。 这片文章假定你已经了解大多数Linux命令,并了解操作系统的基本元素。如果你现在了解的命令还不足10个,下面的内容就不用看了。除了最基本的东西,本文列出一些对你的面试最常见的最能加分的地方,有些组合可能是你没见过的技巧。但本文仅仅是给出一个大致的轮廓和印象,为以后的专题性考察点作一个序。 本文中出现的所有命令,应该熟记并熟练使用。 几种比较典型的Linux系统 首先对目前的Linux版本有个大体的印象,大体分Desktop版和Server版,已经是百花齐放。 Ubuntu 最常见的Linux个人发行版,一位有情怀的南非富豪,有了钱你也可以这么做 CentOS 最常用Linux服务器发新版,RHEL的开放版本,因版权而生的轮子 Arch

处理机调度

坚强是说给别人听的谎言 提交于 2019-12-21 23:26:36
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 背景 在多道程序环境下,内存中存在着多个进程,其数目往往多于处理机数目。这就要求系统能按某种算法,动态地将处理机分配给处于就绪状态的一个进程,分配处理机的任务就是由处理机调度程序完成的。调度的实质是一种 资源分配 。 调度的层次 1. 高级调度 又称长程调度或作业调度,调度对象是 作业 。主要用于多道批处理系统中,而在分时和实时系统中不设置高级调度 2. 低级调度 又称短程调度或进程调度,调度对象是 进程(或内核级线程) 。进程调度是最基本的一种调度,在多道批处理、分时和实时三种类型的OS中,都必须配置。 3. 中级调度 又称内存调度。引入中级调度的主要目的是:提高内存利用率和系统吞吐量。 调度的目标 共同目标 1. 资源利用率 CPU的利用率 = CPU有效工作时间 / (CPU有效工作时间 + CPU空闲等待时间) 2. 公平性 诸进程都能获得合理的CPU时间,不会发生进程饥饿现象 3. 平衡性 4. 策略强制执行 批处理系统的目标 1. 平均周转时间短 周转时间 :从作业被提交给系统开始,到作业完成为止的这段时间间隔(作业周转时间) 它包括四部分: 作业在外存后备队列上等待调度的时间; 进程在就绪队列上等待进程调度的时间; 进程在CPU上执行的时间; 进程等待I/O操作完成的时间 平均周转时间

数据结构(树)

不问归期 提交于 2019-12-14 21:49:24
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 树: 树是 n个结点 的有限集合,有且仅有一个 根结点, 其余结点可分为m个根结点的 子树。 度: 指的是一个节点拥有子节点的个数。如二叉树的节点的最大度为2。 高度/深度: 数的层数,根节点为第一层,依次类推。 叶子节点: 度为0的节点,即没有子节点的节点。 二叉树: 在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子) 前序遍历(前根遍历): 根 ——>左——>右 中序遍历(中根遍历):左——> 根 ——>右 后序遍历(后根遍历):左——>右——> 根 满二叉树: 在一棵二叉树中,如果所有分支结点都有左孩子和右孩子结点,并且叶子结点都集中在二叉树的最下层,这样的树叫做满二叉树 高度为h,由2^h-1个节点构成的二叉树。 完全二叉树: 二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数(即1~h-1层为一个满二叉树),第 h 层所有的结点都连续集中在最左边。 二叉查找树(BST): 又称二叉排序树,亦称二叉搜索树(Binary Search Tree)。 定义: 一棵空树,或者是具有下列性质的二叉树: 1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; 2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; 3)左

非易失性内存NVM

﹥>﹥吖頭↗ 提交于 2019-12-13 14:31:56
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 冯诺依曼体系由四大块组成:运算和控制构成了中央处理器,另外的三个组成部分是输入、存储和输出。 本文关注的是其中的存储,谈及存储,又可以分成不同的层次。下图截取自百度图片,从图中可以看到,从主存到外存处理速度和空间有很大的差异 最上边寄存器的处理延迟约为1纳秒;L2的缓存延时约为10纳秒;L3 DRAM主存的延时约为60纳秒;L4 磁盘的延时约为5毫秒。 传统的主存是DRAM,(Dynamic Random Access Memory)动态随机存储器,而NVM(Non-Volatile Memory)非易失存储器也可以作为主存。不同类型的主存有不同的物理实现,也有各自适用的读写和运算场景。当新的技术和产品出现的时候,我们要看到它的优势,但也不能过多的强度传统的存储有什么问题。NVM是对于原有DRAM的一种补充。它的非易失性使得数据可以持久地存储在内存中;这样让系统有了瞬时从系统故障中恢复的可能。 2015年Intel和美光联手发布了新的存储在3D Xpoint ,它是以字节为粒度进行访问的,处理器对于NVM的原子写操作单元非常的小,只有8K字节。 非易失的持久内存的出现,是对于原有易失性内存和持久性外存结构的改变;结构的改变也会引发算法的数据结构和上层应用程序开发设计思想的改变;特别是对于不同的读写量要求

存储结构分四类:顺序存储、链接存储、索引存储 和 散列存储

♀尐吖头ヾ 提交于 2019-12-05 08:36:55
存储结构分四类:顺序存储、链接存储、索引存储 和 散列存储 存储结构分四类:顺序存储、链接存储、索引存储 和 散列存储。 顺序结构和链接结构适用在内存结构中。 顺序表每个单元都是按物理顺序排列的,如果你想访问那个单元你可以根据提供的指针等直接访问到需要的东西,但是链表是逻辑连续不是物理连续,你要访问必须从第一个指针一个一个往下找,直到找到位置 索引结构和散列结构适用在外存与内存交互结构。 顺序存储:在计算机中用一组地址连续的存储单元依次存储线性表的各个数据元素,称作线性表的顺序存储结构。 特点: 1、随机存取表中元素。 2、插入和删除操作需要移动元素。 链接存储:在计算机中用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。它不要求逻辑上相邻的元素在物理位置上也相邻.因此它没有顺序存储结构所具有的弱点,但也同时失去了顺序表可随机存取的优点。 特点: 1、比顺序存储结构的存储密度小 (每个节点都由数据域和指针域组成,所以相同空间内假设全存满的话顺序比链式存储更多)。 2、逻辑上相邻的节点物理上不必相邻。 3、插入、删除灵活 (不必移动节点,只要改变节点中的指针)。 4、查找结点时链式存储要比顺序存储慢。 5、每个结点是由数据域和指针域组成。 索引存储:除建立存储结点信息外,还建立附加的索引表来标识结点的地址。索引表由若干索引项组成。 特点:

计算机系统中使用Cache和虚拟存储器的作用是什么

[亡魂溺海] 提交于 2019-12-04 11:37:30
通常人们所说的 Cache 就是指缓存SRAM。 SRAM叫静态内存,“静态”指的是当我们将一笔数据写入SRAM后,除非重新写入新数据或关闭电源,否则写入的数据保持不变。由于CPU的速度比内存和硬盘的速度要快得多,所以在存取数据时会使CPU等待,影响计算机的速度。SRAM的存取速度比其它内存和硬盘都要快,所以它被用作电脑的高速缓存(Cache)。 有了高速缓存,可以先把数据预写到其中,需要时直接从它读出,这就缩短了CPU的等待时间。高速缓存之所以能提高系统的速度是基于一种统计规律,主板上的控制系统会自动统计内存中哪些数据会被频繁的使用,就把这些数据存在高速缓存中,CPU要访问这些数据时,就会先到Cache中去找,从而提高整体的运行速度。一般说来,256K的高速缓存能使整机速度平均提高10%左右 虚拟存储器 就是 把内外存统一起来使用,起基本思想是把正在是用的部分保留在内存中。把暂时不用的部分防在外村中,使用时调入内存,虚拟存储器的容量与cpu的地址结构有关,如奔腾的地址位是32位,那么他的寻址空间就是2的32次方,4GB,就是说他的最大寻址空间是4GB。 相似之处 :①把程序中最近常用的部分驻留在高速的存储器中; ②一旦这部分变得不常用了,把它们送回到低速的存储器中; ③这种换入换出是由硬件或操作系统完成的,对用户是透明的; ④力图使存储系统的性能接近高速存储器,价格接近低速存储器

python学习10.08:Python元组和列表的区别

China☆狼群 提交于 2019-12-02 00:13:48
元组和列表同属序列类型,且都可以按照特定顺序存放一组数据,数据类型不受限制,只要是 Python 支持的数据类型就可以。那么,元组和列表有哪些区别呢? 元组和列表最大的区别就是,列表中的元素可以进行任意修改,就好比是用铅笔在纸上写的字,写错了还可以擦除重写;而元组中的元素无法修改,除非将元组整体替换掉,就好比是用圆珠笔写的字,写了就擦不掉了,除非换一张纸。 可以理解为,tuple 元组是一个只读版本的 list 列表。 需要注意的是,这样的差异势必会影响两者的存储方式,我们来直接看下面的例子: >>> listdemo = [] >>> listdemo.__sizeof__() 40 >>> tupleDemo = () >>> tupleDemo.__sizeof__() 24 可以看到,对于列表和元组来说,虽然它们都是空的,但元组却比列表少占用 16 个字节,这是为什么呢? 事实上,就是由于列表是动态的,它需要存储指针来指向对应的元素(占用 8 个字节)。另外,由于列表中元素可变,所以需要额外存储已经分配的长度大小(占用 8 个字节)。但是对于元组,情况就不同了,元组长度大小固定,且存储元素不可变,所以存储空间也是固定的。 读者可能会问题,既然列表这么强大,还要元组这种序列类型干什么? 通过对比列表和元组存储方式的差异,我们可以引申出这样的结论,即元组要比列表更加轻量级

B-Tree和B+Tree索引

情到浓时终转凉″ 提交于 2019-11-30 13:30:02
B-Tree是为磁盘等外存储设备设计的一种平衡查找树。先了解磁盘的相关知识: 1.系统从磁盘读取数据到内存时是以磁盘块为基本单位的,位于同一磁盘块中的数据会被一次性的读取出来,而不是需要什么读取什么。 2.InnerDB存储引擎中是有页(Page)的概念,页是其管理的最小单位。默认每页的大小为16KB,可以设置。InnerDB在把磁盘数据读入内存的时候,会以页为基本单位。B-Tree的结构可以让系统高效的找到数据所在的磁盘块。 来源: https://my.oschina.net/u/3126880/blog/3111485