空间数据

第六章大数据和空间限制

烂漫一生 提交于 2019-12-08 18:49:31
1,布隆过滤器及其应用 此题在另一篇博客已经有介绍。 2,只用2GB内存在20亿个整数中找到出现次数最多的数 题目:有一个包含20亿个全是32位整型的大文件,在其中找到出现次数最多的数。 要求:内存限制为2GB。 思路:要找出出现次数最多的数,通常的做法是使用哈希表对出现的每一个数做词频统计,哈希表的key是某一个整数,value是这个数出现的次数。就本题来说,一共有20亿个数,哪怕只是一个数出现了20亿次,用32位的整数也可以表示其出现的次数而不会产生溢出,所以哈希表的key需要占用4B,value也是4B。那么哈希表的一条记录(key,value)需要占用8B,当哈希表记录数为2亿个时,需要至少1.6GB内存。 但如果20亿个数中不同的数超过2亿种,最极端的情况是20亿个数都不同,那么在哈希表中可能需要产生20亿条记录,这样内存会不够用,所以一次性用哈希表统计20亿个数的方法是有很大风险的。 解决方法是把20亿个数用哈希函数分成16个小文件,根据哈希函数的性质,同一种数不可能被哈希到不同的小文件上,同时每个小文件中不同的数一定不会大于2亿种,假设哈希函数足够好。然后对每一个小文件用哈希表来统计其中每种数出现的次数,这样我们就得到了16个小文件中各自出现次数最多的数,还有各自的统计次数。接下来只要选出16个小文件各自的第一名中谁出现的次数最多即可。

海量数据处理:算法

感情迁移 提交于 2019-12-08 17:55:57
海量信息即大规模数据,随着互联网技术的发展,互联网上的信息越来越多,如何从海量信息中提取有用信息成为当前互联网技术发展必须面对的问题。 在海量数据中提取信息,不同于常规量级数据中提取信息,在海量信息中提取有用数据,会存在以下几个方面的问题: (1)数据量过大,数据中什么情况都可能存在,如果信息数量只有20条,人工可以逐条进行查找、比对,可是当数据规模扩展到上百条、数千条、数亿条,甚至更多时,仅仅只通过手工已经无法解决存在的问题,必须通过工具或者程序进行处理。 (2)对海量数据信息处理,还需要有良好的软硬件配置,合理使用工具,合理分配系统资源。通常情况下,如果需要处理的数据量非常大,超过了TB级,小型机、大型工作站是要考虑的,普通计算机如果有好的方法也可以考虑,如通过联机做成工作集群。 (3)对海量信息处理时,要求很高的处理方法和技巧,如何进行数据挖掘算法的设计以及如何进行数据的存储访问等都是研究的难点。 针对海量数据的处理,可以使用的方法非常多,常见的方法有Hash法、Bit-map法、Bloom filter法、数据库优化法、倒排索引法、外排序法、Trie树、堆、双层桶法以及MapReduce法。 Hash法 哈希函数的特点 哈希函数的构建方法 解决冲突的方法 Bit-map法 Bloom filter法 数据库优化法 倒排索引法 外排序法 Trie树 堆 双层桶法

Linux操作系统 内存管理、用户操作和文件操作

﹥>﹥吖頭↗ 提交于 2019-12-08 05:16:21
内存管理、用户操作和文件操作 预备知识: 1、Linux系统的内存分为物理内存和虚拟内存。 物理内存 是指安装在计算机当中的主存储器; 虚拟内存 是 一段 虚拟的逻辑上连续的储存空间, 虚拟内存是由多个内存碎片组成,只有 正在使用的 虚拟内存被存放在 内存 上,对于暂时不使用的虚拟内存空间其实是储存在 外存 中。虚拟内存空间地址和实际的物理内存空间地址存在某种逻辑上的关系,如果虚拟内存空间地址的内容将被使用,通过逻辑关系可以计算出此部分内容对应的实际物理内存空间,然后将内容加载到内存中。虚拟内存在 一定程度上 独立于物理内存。 2、计算机的物理 内存空间有限(虚拟内存只要运行部分占用物理内存空间) 而且不同PC的 物理内存是不一样(通过虚拟内存空间,进程中代码的访存操作的地址全部是这个内存空间的地址) ,所以进程使用的是 虚拟内存空间 。 3、内存的最小粒度是页,进程虚拟地址空间和内存的映射也是以页为单位。页(面)的大小称为页面的大小,大小应该为2的幂。页号P=A/L;A表示逻辑地址空间中的地址(虚拟内存空间地址),L表示页面大小。 4、物理块:将内存的物理地址空间划分为若干块,称为物理块,物理块与页(面)一一对应。 5、页表储存在物理内存中,由操作系统维护。CPU中有一个 页表寄存器 ,里面存放着当前进程页表的 起始地址和页表长度

malloc的原理

霸气de小男生 提交于 2019-12-07 07:44:20
任何一个用过或学过C的人对malloc都不会陌生。大家都知道malloc可以分配一 段连续的内存空间,并且在不再使用时可以通过free释放掉。但是,许多程序员对malloc背后的事情并不熟悉,许多人甚至把malloc当做操作系统 所提供的系统调用或C的关键字。实际上,malloc只是C的标准库中提供的一个普通函数,而且实现malloc的 基本 思想并不复杂,任何一个对C和操作系统有些许了解的程序员都可以很容易理解。 这篇文章通过实现一个简单的malloc来描述malloc背后的机制。当然与现有C的标准库实现(例如glibc)相比,我们实现的malloc 并不是特别高效,但是这个实现比目前真实的malloc实现要简单很多,因此易于理解。重要的是,这个实现和真实实现在基本原理上是一致的。 这篇文章将首先介绍一些所需的基本知识,如操作系统对进程的内存管理以及相关的系统调用,然后逐步实现一个简单的malloc。为了简单起见,这篇文章将只考虑x86_64体系结构,操作系统为Linux。 1 什么是malloc 2 预备知识 2.2.1 内存排布 2.2.2 Heap内存模型 2.2.3 brk与sbrk 2.2.4 资源限制与rlimit 2.1.1 虚拟内存地址与物理内存地址 2.1.2 页与地址构成 2.1.3 内存页与磁盘页 2.1 Linux内存管理 2.2 Linux进程级内存管理

ORACLE临时表空间总结

房东的猫 提交于 2019-12-07 03:33:33
临时表空间概念 临时表空间用来管理数据库排序操作以及用于存储临时表、中间排序结果等临时对象,当ORACLE里需要用到SORT的时候,并且当PGA中sort_area_size大小不够时,将会把数据放入临时表空间里进行排序。像数据库中一些操作: CREATE INDEX、 ANALYZE、SELECT DISTINCT、ORDER BY、GROUP BY、 UNION ALL、 INTERSECT、MINUS、SORT-MERGE JOINS、HASH JOIN等都可能会用到临时表空间。当操作完成后,系统会自动清理临时表空间中的临时对象,自动释放临时段。这里的释放只是标记为空闲、可以重用,其实实质占用的磁盘空间并没有真正释放。这也是临时表空间有时会不断增大的原因。 临时表空间存储大规模排序操作(小规模排序操作会直接在RAM里完成,大规模排序才需要磁盘排序Disk Sort)和散列操作的中间结果.它跟永久表空间不同的地方在于它由临时数据文件(temporary files)组成的,而不是永久数据文件(datafiles)。临时表空间不会存储永久类型的对象,所以它不会也不需要备份。另外,对临时数据文件的操作不产生redo日志,不过会生成undo日志。 创建临时表空间或临时表空间添加临时数据文件时,即使临时数据文件很大,添加过程也相当快

编程实现感染PE文件加载DLL

不打扰是莪最后的温柔 提交于 2019-12-07 01:00:46
PE文件是Windows系统可执行文件采用的普遍格式,像我们平时接触的EXE、DLL、OCX,甚至SYS文件都是属于PE文件的范畴。很多Win32病毒都是基于感染PE文件来进行传播的。今天我们就来尝试一下通过感染PE文件使其加载指定的DLL。       PE文件功能   众所周知,在Windows程序中需要调用各种各样的系统API,这些API被微软封装在不同的DLL文件中,这些DLL会在进程启动时(或者需要时)加载进进程的地址空间。我们调用一个API都是基于如下的汇编代码: 00411A3E mov esi,esp 00411A40 push 100h 00411A45 lea eax,[strDllDir] 00411A4B push eax 00411A4C call dword ptr [__imp__GetWindowsDirectoryA @8 (42B180h)] 这些汇编代码是针对如下代码的反汇编结果: char strDllDir[256]; GetWindowsDirectory(strDllDir,256);      可见,调用一个系统API是在参数压栈后调用call命令执行系统调用GetWindowsDirectory()的。上文说过,系统调用是通过DLL引入进程的,但是不同进程引入的DLL地址并不相同,程序是如何知道这个Call应该调用什么地址呢

Spark (三) 性能优化

∥☆過路亽.° 提交于 2019-12-06 20:35:05
参数配置 1、spark-env.sh 2、程序通过SparkConf或System.setProperty 性能观察与日志 1)Web UI。 2)Driver程序控制台日志。 3)logs文件夹下日志。 4)work文件夹下日志。 5)Profiler工具。 调度与分区优化 1.小分区合并 频繁的过滤或者过滤掉的数据量过大就会产生问题,造成大量小分区的产生。Spark是每个数据分区都会分配一个任务执行,如果任务过多,则每个任务处理的数据量很小,会造成线程切换开销大,很多任务等待执行,并行度不高; 解决方式:可以采用RDD中重分区的函数进行数据紧缩,减少分区数,将小分区合并变为大分区。 通过coalesce函数来减少分区。这个函数会返回一个含有numPartitions数量个分区的新RDD,即将整个RDD重分区。 当分区由10000重分区到100时,由于前后两个阶段的分区是窄依赖的,所以不会产生Shuffle的操作。 但是如果分区数量急剧减少,如极端状况从10000重分区为一个分区时,就会造成一个问题:数据会分布到一个节点上进行计算,完全无法开掘集群并行计算的能力。为了规避这个问题,可以设置shuffle=true 由于Shuffle可以分隔Stage,这就保证了上一阶段Stage中的上游任务仍是10000个分区在并行计算。如果不加Shuffle

【翻译笔记】Hadoop分布式文件系统

我与影子孤独终老i 提交于 2019-12-06 20:31:17
摘要 Hadoop分布式文件系统(HDFS)设计用来可靠的存储超大数据集,同时以高速带宽将数据集传输给用户应用。 在一个超大集群中,数以千计的服务器直接接触存储器和执行用户应用任务。 通过许多服务器的分布式存储和计算,资源随需求增长的时候仍然可以保持经济性。 我们解释了HDFS架构,同时介绍了我们在雅虎使用HDFS去管理25PB企业数据的经验。 1、介绍和相关工作 Hadoop 的 一个重要特点是将数据和计算能力划分为小部分,通过许多(数千)主机运行 ,这些主机并行计算得到他们的结果。一个 Hadoop 集群通过简单增加商用服务器的数量来扩展其计算能力,存储能力和 IO 带宽。 1.1、与其他分布式系统的异同点 相同点 HDFS 分别存储文件系统元数据和应用程序数据。 与在 其他分布式文件系统 中相同, 比如 PVFS 【 2 】【 14 】, Lustre 【 7 】和 GFS 【 5 】【 8 】, HDFS 在一个专门的服务器存储元数据,这个服务器被称为名称节点。应用程序数据存储在其他被称为数据结点的服务器上。 不同点 HDFS中的数据节点 并不使用数据保护机制 比如RAID( 独立磁盘冗余阵列 ),以确保数据持久性。 相反。比如GFS, 其文件内容在多个数据节点是重复的以确保可靠性 。 这个策略不仅仅可以确保数据持久性,还有额外的优点:数据变形带宽加倍

物理内存与虚拟内存之间的映射

耗尽温柔 提交于 2019-12-06 19:31:39
1、用户编制程序时使用的地址称为 虚地址或逻辑地址 ,其对应的存储空间称为虚存空间或逻辑地址空间;而计算机物理内存的访问地址则称为实地址或物理地址,其对应的存储空间称为物理存储空间或主存空间。 2、虚拟存储器的 容量限制 :主存容量+辅存(硬盘)容量。 3、 物理内存: 在应用中,真实存在的,插在主板内存槽上的内存条的容量的大小。从本质上来说,物理内存是代码和数据在其中运行的窗口。 4、 虚拟内存: 使程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。 若计算机运行程序或操作所需的随机存储器(RAM)不足时,则 Windows 会用虚拟存储器进行补偿,即拿出一部分硬盘空间来充当内存使用,这部分空间即称为虚拟内存,虚拟内存在硬盘上的存在形式就是 PAGEFILE.SYS这个页面文件。它将计算机的RAM和硬盘上的临时空间组合。将数据移入分页文件可释放RAM,以便完成工作。 若计算机的速率由于RAM可用空间匮乏而减缓,则可尝试通过增加虚拟内存来进行补偿。但是,计算机从RAM读取数据的速率要比从硬盘读取数据的速率快,因而扩增RAM容量(可加内存条)是最佳选择。 分页文件:硬盘上一个或者多个隐藏文件pagefile.sys,Windows用于存储未存入内存的部分程序和数据文件

监督学习概述

大兔子大兔子 提交于 2019-12-06 18:34:26
  统计学习包括监督学习、非监督学习、半监督学习及强化学习。监督学习(supervised learning)的任务是学习一个模型,使模型能够对任意给定的输入,对其相应的输出做出一个好的预测(注意,这里的输入、输出是指某个系统的输入与输出,与学习的输入与输出不同)。计算机的基本操作就是给定一个输入产生一个输出,所以监督学习是极其重要的统计学习分支,也是统计学习中内容最丰富、应用最广泛的部分。   1.输入空间、特征空间与输出空间   在监督学习中,将输入与输出所有可能取值的集合分别称为输入空间(input space)与输出空间(output space)。输入与输出空间可以是有限元素的集合,也可以是整个欧氏空间。输入空间与输出空间可以是同一个空间,也可以是不同的空间,但通常输出空间远远小于输入空间。 每个具体的输入是一个实例(instance),通常由特征向量(feature vector)表示。这时,所有特征向量存在的空间称为特征空间(feature space)。特征空间的每一维对应于一个特征。有时假设输入空间与特征空间为相同的空间,对它们不予区分;有时假设输入空间与特征空间为不同的空间,将实例从输入空间映射到特征空间。模型实际上都是定义在特征空间上的。 在监督学习过程中,将输入与输出看作是定义在输入(特征)空间与输出空间上的随机变量的取值。输入、输出变量用大写字母表示