10亿个整型(长整型)数据的存储,如果按照一般的int类型或者long类型存储的话,那会占据较大的内存空间:
比如使用long类型存储10亿个数据,一个long类型为64位二进制,即8个字节(8B),1024B = 1KB , 1024KB = 1M ,1024M = 1G ,那么10亿个long类型数据大小为:1000000000*8/1024/1024/1024 = 7.5G(约等于),这样一个数据量的情况下,如果还要对其进行查重的话,那将会非常影响程序的运行速度。

为了缩减空间,我想直接使用二进制来存储数据,0表示某个数据不存在,1表示某个数据存在,那么就需要10亿个0或者1来表示10亿个数据 , 存储所占的空间便是:1000000000/8/1024/1024 = 120M(约等于),从7.5G变成120M,不仅节省了大量的空间而且查重的话,我只需要判断该数据所对应的二进制位是否为1即可

以上只是理论如此,但实际的空间应该不止120M,不过也肯定比7.5G要小很多。

在JAVA中没有直接用来表示二进制的数据类型,所以我决定还是直接存储long类型的方式来完成上面的设想,一个long类型为64位,其中包括一位符号位,所以实际可用的位数为63位,那么我就需1000000000/63 = 15873016个long类型的数据,这里就需要 1000000000/63*8/1024/1024 = 122M(约等于)的空间。

那么如何才能知道15873016个long类型的数据中,每一个所代表的63位具体数据是什么呢,其实很简单,都已经分好了每63个数据放在一个long类型的二进制中,那给每一个long类型一个索引即可,索引的计算就是具体的数据/63,比如0/63 = 0 , 1/63 = 0 , 5/63 = 0 , 62/63 = 0,也就是说[0,62]区间内的所有整数的索引都是0,[63,125]索引为1 …以此类推,索引存储为int类型,一共有15873016个索引,占据的空间就是:15873016 * 4/1024*1024 = 61M(约等于)

从上面来看,所需要的总空间大小大约为 122 + 61 = 183M , 没超过500M,就是要500M 空间,那也远比7.5G要小。

具体的java实现如下:

我采用了HashMap<Interger,Long>来存储全部数据 , Interger便是我上述 所谓的索引,Long便是每一个数据
注: 全文包括代码实现仅是个人想法记录,以下代码仅适合存储正整数,比如对电话号码的存储和查重,个人通过简单的输入数据存储和查询是否存在的测试都是通过了的,如有我没考虑清楚的地方请指出,或者有更好的实现方式也希望大家能分享给我。

public class BitStorage {private  HashMap<Integer , Long> storageMap = new HashMap<>();//所有数据的存储单元 mapprivate int part = 0;//段 ,即存储单元Map的keyprivate int offSet = 0;//数据偏移量 , 在value的数据中的偏移量//存储一个数据public void addData(Long longData){part = (int)(longData / 63);offSet = (int)(longData % 63);String str = getBVStr(part);//首先在map中获取该数据所在的段即long类型数据的二进制字符串int number = offSet - str.length();StringBuilder stringBuilder = addZero(str , number);stringBuilder.reverse().replace(offSet , offSet +1 , "1");storageMap.put(part , convertLong(stringBuilder));}//判断一个数据是否已经存储public boolean isExist(Long l){part = (int)(l / 63);Long aLong = storageMap.get(part);String str = getBVStr(part);if(str == "0"){//段不存在,数据一定不存在return false;}offSet = (int)(l % 63);int length = str.length();if(length - 1 < offSet){//长度小于偏移量,数据一定不存在return false;}if(str.charAt(length-1-offSet) == '1'){//判断具体所对应的二进制位是否为1return true;}else{return false;}}//字符串增加长度private StringBuilder addZero(String s, int number){for(int i = 0 ; i <= number ; i++){s = "0" + s;}return new StringBuilder(s);}//获取数据的数据的二进制字符串形式,如果存储单元中不存在该段数据,则返回字符串0private String getBVStr(int key){Long l = storageMap.get(key);if(l == null){return "0";}else{return Long.toBinaryString(l);}}//转换成Long类型的数据private Long convertLong(StringBuilder stringBuilder){int length = stringBuilder.length();long l = 0;for(int i = 0 ; i < length ; i++){if(stringBuilder.charAt(i) == '1'){l += (long)Math.pow(2,i);}}return new Long(l);}
}

10亿量级数据(long)存储相关推荐

  1. 如何存储10亿的数据

    最近突然想到这么一个问题: 假如有<10亿的数据,每个数据不重复,同时是无序,不连续的,如何使用最小的空间来存储来这么多数据,同时又能快速的确认哪个数据有没有. 直接存储10亿个数据 一个int ...

  2. 堆排序及从10亿个数据中找出最小或最大的10个数

    高频面试题目 一.堆排序 1.基础知识 * ------基本知识: * 1. 堆数据结构特征: * 大顶堆:所有父节点大于等于左右子节点,arr[i] >= arr[2i+1] &&am ...

  3. 10亿条数据去重后排序和在线日志人数统计

    一:10亿条数据排序 思路:数据量比较大,普通比较会占用很多的内存,可以采用其他方法,构造一个字节数组 每个字节的值代表连续八个整形数据的值是否存在,即使包括最大的整数值,大概内存512m 源码如下 ...

  4. MongoDB在58同城百亿量级数据下的应用实践

    58同城作为中国最大的生活服务平台,涵盖了房产.招聘.二手.二手车.黄页等核心业务.58同城发展之初,大规模使用关系型数据库(SQL Server.MySQL等),随着业务扩展速度增加,数据量和并发量 ...

  5. 程序员过关斩将--快速迁移10亿级数据

    菜菜呀,咱们业务BJKJ有个表数据需要做迁移 程序员主力 Y总 现在有多少数据? 菜菜 大约21亿吧,2017年以前的数据没有业务意义了,给你半天时间把这个事搞定,绩效给你A 程序员主力 Y总 有绩效 ...

  6. 百度贴吧10亿量级LAMP架构分享

    导读:天下武功,唯快不破.对日益激烈的互联网竞争你所拥有的利器就是快!本文来自百度贴吧的LAMP解决方案介绍,摘录至此旨在研究分享,看看其是如何全面支持快速迭代的. 文章内容如下: 贴吧是功能性产品, ...

  7. 对10亿个数据去重java_20 亿个数字在 4G 内存中如何去重排序:快来试一试 BitMap...

    有一道流传广泛的面试题: 给你一台 4G 内存的机器,一组 20 亿个无序正整数,如何快速地判断一个正整数 N 是否在这组数字中?或者如何快速地对这组数据排重后排序? 让我们先算算 20 亿个整数会占 ...

  8. 程序员如何快速迁移 10 亿级数据?

    问题分析 经过几分钟的排查,数据库情况如下: 1.数据库采用Sqlserver 2008 R2,单表数据量21亿. 2.无水平或者垂直切分,但是采用了分区表.分区表策略是按时间降序分的区,将近30个分 ...

  9. 删除10亿人脸数据,Meta关闭了Facebook的人脸识别系统

    来源:机器之心 本文约1700字,建议阅读5分钟 本文为你介绍了Meta在人脸识别系统上的最新动态. 选择一劳永逸,Meta 再不想为 Facebook 的人脸识别系统「买单」了. 在近期召开的 Fa ...

最新文章

  1. SAP WM初阶事务代码LX29 - List of Fixed Storage Bins
  2. 【深度学习入门到精通系列】阿里云人工智能平台的使用方法
  3. SpringBootStarter种类
  4. 数据中心成为生态系统向绿色氢经济转变的催化剂
  5. python super用法
  6. Unity性能优化的N种武器
  7. Chrome 过滤广告插件暂替办法
  8. eslint检测时报错
  9. Catalan数表达式完整推导
  10. MySQL05:DCL语言、视图
  11. 短信服务器和运营商的区别,什么是短信服务商?与短信运营商的区别
  12. 一个Unity3D制作的坦克游戏——《燃烧的地平线》
  13. HTML——简单的网站首页
  14. Excel 2010 SQL应用096 聚合函数之标准偏差及标准差
  15. Linux 基础命令 -- usermod
  16. 菜鸟弱弱地问:找个薪资待遇差的工作能成长吗?
  17. Git之cherry-pick
  18. 机器学习图像分割——模型评价总结(含完整代码)
  19. 画一条连接两点的线,由两点坐标确定一条直线
  20. 知识付费这么红,它会成为KFC吗?

热门文章

  1. 【Tried to access visual service WindowManager from a non-visual Context】
  2. 使用百度加固服务给app应用加固
  3. GC3901 低压5V 全桥驱动芯片,国产低成本替代allegroA3901
  4. 功能测试用例编写2(商城注册登录及购物车模块)
  5. 运行wordcount的时候显示INFO mapreduce.Job: map 0% reduce 0%
  6. sudo apt-get 停留在0%的解决办法
  7. Nordic 52832 BLE Central Demo 分析
  8. 墨者学院-Bash漏洞分析溯源
  9. inux 系统运行级别
  10. 支付宝支付成功后通知在微信打开的提示页面