存储超过内存大小的数据

标签: 内存 大小 数据 | 发表时间:2013-10-13 10:34 | 作者:
出处:http://www.iteye.com
  问题是这样的:如何存储5亿个正整数,并对这些数据进行排重。
  直接用一个长度为5亿的int型数组存起来?这显然是不可能的,让我们来计算一下:
  一个int型数据占用4byte,5亿个正整数也就是1.6*10^10bit,约为16G,16G的数据全存在内存里,内存显然不够用。那么,如何才能缩小占用空间呢?
  再回到问题上看看,问题要求对数据进行排重,在用int存储的情况下,这5亿个数据的范围也就是0-2^31,排重的结果不过就是0到2^31的每一个数值都最多只有一个数存在。约定用1表示有这个数,0表示没有这个数,如此一来就可以用一个bit来表示一个数了。
  解决方法如下:建立一个长度为2^28的byte型数组,数组中每一个byte每一位的1或0就代表了数据的存在与否。
  在这个题目中,可以认为,我们是从数据流中接收到5亿个数据的。每收到一个数据,就判断它在byte数组中是否存在,若不存在,这把代表这个数据的那一位由0改为1。

  代码如下:
//创建一个长度为2^28的byte数组
	byte bytes[] = new byte[(int)Math.pow(2, 28)];
	int i;//表示数组的第几位
	int j;//表示一个byte数据的第几位
	int b;//bytes[i]无符号转化后的int数值
	int a;//bytes[i]的第j为数值
	
	/**
	 * 保存出输入流中读到的数据
	 * @param x	从输入流中获得的正整数
	 */
	public void paichong(int x){
			i = x/8;//一个byte可以存8个数
			j = x%8;
			this.isExist(x);//判断该数是否已经出现过
			if(a==0){//若没有出现过,这把这一位改为1
				if(j==7){//若为最高为,直接加2^7最高会变成1,但是其他位也会发生变化
					bytes[i] -= 2*bytes[i];
				}else bytes[i] += (int)Math.pow(2, j); 
			}
	}

	/**
	 * 判断x是否曾经出现过
	 * @param x
	 */
	private void isExist(int x) {
		b = bytes[i];
		if(bytes[i]<0){
			b = (int)(-bytes[i])+128;
		}else b = bytes[i];
		//类似四位数的位数获得方法
		a = b/(int)Math.pow(2, j)%(int)Math.pow(2, 7-j);
	}
  }


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [内存 大小 数据] 推荐:

存储超过内存大小的数据

- - ITeye博客
  问题是这样的:如何存储5亿个正整数,并对这些数据进行排重.   直接用一个长度为5亿的int型数组存起来. 这显然是不可能的,让我们来计算一下:.   一个int型数据占用4byte,5亿个正整数也就是1.6*10^10bit,约为16G,16G的数据全存在内存里,内存显然不够用.   再回到问题上看看,问题要求对数据进行排重,在用int存储的情况下,这5亿个数据的范围也就是0-2^31,排重的结果不过就是0到2^31的每一个数值都最多只有一个数存在.

VoltDB内存数据库分析

- - 淘宝核心系统团队博客
VoltDB是一个宣称性能超过Mysql 100倍的新型数据库. 它源自Micheal Stonebraker一篇论文H-Store. 在这篇论文发表后,Stonebraker成立了VoltDB公司带着他的一些学生开始在OLTP数据库领域打拼. Stonebraker从上世纪70年代——数据库刚开始发展的时间——就开始在数据库领域活跃,这样的老古董提出的数据库的新想法,给了整个存储领域很大的想象空间.

PHP查询MySQL大量数据的内存占用分析

- Avenger - OurMySQL
这篇文章主要是从原理, 手册和源码分析在PHP中查询MySQL返回大量结果时, 内存占用的问题, 同时对使用MySQL C API也有涉及.. 昨天, 有同事在PHP讨论群里提到, 他做的一个项目由于MySQL查询返回的结果太多(达10万条), 从而导致PHP内存不够用. 所以, 他问, 在执行下面的代码遍历返回的MySQL结果之前, 数据是否已经在内存中了.

对内存数据库的使用已达临界点

- - InfoQ cn
微软的David Campbell在文章《 内存数据库即将到到临界点(The coming in-memory database tipping point)》中说到, 内存数据库离广泛采用越来越近了. 他还说明了微软在这个领域的策略. 据David所说,以下各种趋势使得内存数据库会在五年内变得普遍:.

内存数据库分析-装载整理

- - 人月神话的BLOG
转载整理自: http://titan.iteye.com/. 传统的数据库管理系统把所有数据都放在磁盘上进行管理,所以称做磁盘数据库(DRDB:Disk-Resident Database). 磁盘数据库需要频繁地访问磁盘来进行数据的操作,由于对磁盘读写数据的操作一方面要进行磁头的机械移动,另一方面受到系统调用(通常通过CPU中断完成,受到CPU时钟周期的制约)时间的影响,当数据量很大,操作频繁且复杂时,就会暴露出很多问题.

JAVA内存结构之运行时数据区域

- - Java - 编程语言 - ITeye博客
1       内存区域. 1.1              运行时数据区域. Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域. 这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线锃的启动和结束而建立和销毁.

内存数据库FastDB和SQLite性能测评

- - CSDN博客数据库推荐文章
在很多项目中,经常会碰到这样的需求,需要对大量数据进行快速存储、查询、删除等操作,特别是在一些针对诸如运营商、银行等大型企业的应用中,这些需求尤为常见. 比如智能网中的大量在线并发用户的数据管理、软交换平台中的在线信息交互、宽带/3G等数据网中在线用户行为记录等等. 针对这些情形,我们通常需要选择高性能的数据库产品,而且通常需要使用内存数据库,顾名思义,内存数据库指的是所有的数据访问控制都在内存中进行,这是与磁盘数据库相对而言的,磁盘数据库虽然也有一定的缓存机制,但都不能避免从外设到内存的交换,而这种交换过程对性能的损耗是致命的,目前主流数据库如SYBASE、ORACLE等都有这种缓存机制,如将特定表绑定一定的缓存,从而在一定程度上改善数据吞吐性能.

如何让NoSQL内存数据库适合企业级应用

- - CSDN博客数据库推荐文章
如何让NoSQL内存数据库适合企业级应用. 作者:chszs,转载需注明. 博客主页: http://blog.csdn.net/chszs. 英文原文: How to Make Your In-memory NoSQL Datastores Enterprise-Ready. 对于每一个关注用户体验的Web应用或移动应用而言,NoSQL内存数据库(例如开源的 Redis和Memcached)正逐步成为事实上的标准.

[转]内存数据库的几个典型应用场景

- - 小鸥的博客
近些年内存数据库(IMDB)技术发展迅猛. 除了与生俱来的高性能之外,IMDB本身越来越向着功能完整的独立DB的方向发展. 下面简单描述当前比较常见的几个IMDB应用场景,希望对有志于IMDB技术的同僚以启发——. IMDB最大规模的应用集中在电信领域,尤其以计费系统为主. 当然,近些年陆续开始向新的电信业务领域拓展,例如核心网、CRM、精确营销等.

内存参数设置不合理导致数据库HANG

- - CSDN博客数据库推荐文章
内存参数设置不合理导致数据库HANG. 2节点RAC,数据库忽然HANG住,重启一个实例后恢复正常. 故障时间段约为8:30-10:00,以下为alert报错:. Thread 2> ORA-07445: 出现异常错误: 核心转储 [kksMapCursor()+323] [SIGSEGV] [ADDR:0x8] [PC:0x763597B] [Address not mapped to object] [].