如何存储10亿的数据

数据10亿级别的数据库表,多行存储成一行、一列扩展成多列之数据优化及迁移方案(三) 数据升级:update_t_origin.sql -- 重命名旧表 alter table t_origin rename to bak_t_origin; -- 同义词方案,将新表切换上线 create or replace synonym t_origin for t_origin_01; -- 注:也可以通过视图方案将新表切换上线,语句如下: -- create or repla 阅读详情

最近突然想到这么一个问题:

假如有<10亿的数据,每个数据不重复,同时是无序,不连续的,如何使用最小的空间来存储来这么多数据,同时又能快速的确认哪个数据有没有。

  • 直接存储10亿个数据

一个int的类型,可以最大可以表示:2147483647,这个数大于10亿,所以可以使用一个int(4个字节)来表示一个数。

在这种情况下,需要的空间是4*10^9,大约需要4G的空间。

如果想去查找一个数据在或不在,此时需要把这么多的数据加载到内存中,分别遍历,需要O(n)的时间复杂度。

  • 利用数组的index来存储

数组有一个优势就是可以根据index直接找到数据,正常情况下都是利用数组的空间来存储数据,现在是不是可以反过来利用index来表示数据。

数组的index默认从0增长到n,这个问题中说明了每个数据不重复,这个很符合index的特征,index是不可能重复的。

虽然说这组数据是无序和不连续的,可以将数组初始化成全零,对应存在的index将数据置1,

C/C++中可以构成数组最小的类型是char,那就可以new char[1024*1024*1024]的数组,如果对应index的数据纯在a[n]=1.

在这种情况下,需要的空间是10^9,大约是1G的空间

这个时候如果想查看一个数据在不在,只需要O(1)的时间复杂度。

  • 基于数组的index的位存储

上面的方案已经将空间压缩1/4,是不是还有更优的方案呢?

其实只需要表示一个数字在或不在,那只要0和1就够。

这个时候数组的大小只需要10^9/8就够了,大约130MB,这么大直接加载到内存中也没有问题。

在这种情况下如何访问呢

假设想查看1000这个数在不在,可以通过以下方式:

index = 1000 / 8 = 125

pos = 1000 % 8 = 0

也就是说a[125]的0位表示的是1000。

通过a[index]&(0x01<<pos)来判断数据是不是存在

通过a[index] |= (0x01<<pos)来进行赋值

通过对比发现,通过位运算能够最大程度的减小存储空间,通过也能做到快速访问。

西门子博途系列学习笔记SCL(三)______自由口通讯(RS485轮询程序) 西门子博途V16系列学习笔记SCL(三)___自由口通讯轮询程序(RS485) 西门子博途系列学习笔记SCL(三)______自由口通讯(RS485轮询程序) 文章目录西门子博途V16系列学习笔记SCL(三)___自由口通讯轮询程序(RS485)前言一、FreePort自由口通讯是什么?二、使用步骤1.模块参数定义2.定义FB功能块参数:3.程序代码如下(每天写代码100行,学不会你来找我):总结 前言 很长时间都没有更新了,主要是最近在学习罗克韦尔的STUDIO5000PLC编程软件,怎么说,和博 阅读详情

相关推荐

CoppeliaSim和Python进行无人机联合仿真

CopeeliaSim和Python进行无人机轨迹跟踪联合仿真。首先建立起CoppeliaSim和Python的连接,其次在Python中生成轨迹,CoppeliaSim仿真环境中的无人机进行跟踪,并绘制出轨迹曲线,有每一步详细的教学。

加斯顿工程师的博客 961

C#使用List类实现动态变长数组的方法

本文实例讲述了C#使用List类实现动态变长数组的方法。分享给大家供大家参考。具体如下: C#中的list可以当做数组使用,而且无需定义长度,完全是动态的 class Person { public string Name { get; set; } public string Address { get; set; } } static void Main(string[] args) { List<Person> people = new List<Person>(); people.Add(new Person() { Name = kaka, Address =

MNIST数据

MNIST数据集是一个入门级的计算机视觉数据集,数据集中都是美国中学生手写的数字,其中训练集包括6万张图片,测试集包括1万张图片,并且数字已经进行过预处理和格式化。

10亿int整型数,以及一台可用内存1GB的机器,时间复杂度要求O(n),统计只出现一次的数?

答: 首先分析多大的内存能够表示10亿的数呢?一个int型占4字节,10亿就是40亿字节(很明显就是4GB),也就是如果完全读入内存需要占用4GB,而题目只给1GB内存,显然不可能将所有数据读入内存。 我们先不考虑时间复杂度,仅考虑解决问题。那么接下来的思路一般有两种。 位图法:用一个bit位来标识一个int整数。 分治法:分批处理这10亿的数。 一种是位图法,如果各位老司机有经验的话很快会...

Jiashilin 1946

头条一面:亿数据怎么统计

在移动应用的业务场景中,我们需要保存这样的信息:一个 key 关联了一个数据集合。常见的场景如下:给一个 userId ,判断用户登陆状态;显示用户某个月的签到次数和首次签到时间;两亿用户...

IT技术精选文摘 798

海量数据问题解决思路

1.给定100亿个整数,设计算法找到只出现一次的整数? 分析:100亿个整数大概占用40G内存空间 数据出现的次数分为3种:出现0次、出现1次、出现2次及以上 使用位图来解决问题,两个位表示一个整数:00、0110 2.给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集? 方案一:将其中一个文件的整数映射到一个位图中,读取另外一个文件的整数,判断在不在位图中,在就是交集,消耗500M内存。 方案二:将其中一个文件的整数映射到一个位图中,将另外一个文件的整数映射到另外一个位图中,然后

是胖胖没错了的博客 702

海量数据处理 - 10亿个数中找出最大的10000个数(top K问题)

[size=small] 前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小堆比较好一些。 先拿10000个数建堆,然后一次添加剩余元素,如果大于堆顶的数(10000中最小的),将这个数替换堆顶,并调整结构使之仍然是一个最小堆,这样,遍历完后,堆中的10000个数就是所需...

飘在上海的北方人 2513

算法10亿int型数,统计只出现一次的数

题目10亿int整型数,以及一台可用内存1GB的机器,时间复杂度要求O(n),统计只出现一次的数?分析首先分析多大的内存能够表示10亿的数呢?一个int型占4字节,10亿就是40亿字节(很明显就是4GB),也就是如果完全读入内存需要占用4GB,而题目只给1GB内存,显然不可能将所有数据读入内存。我们先不考虑时间复杂度,仅考虑解决问题。那么接下来的思路一般有两种。 位图法:用一个bit位来标识一个i

Mlib 1万+

10亿量级数据(long)存储

全文包括代码实现仅是个人想法记录,以下代码仅适合存储正整数,比如对电话号码的存储和查重,个人通过简单的输入数据存储和查询是否存在的测试都是通过了的,如有我没考虑清楚的地方请指出,或者有更好的实现方式也希望大家能分享给我。

m0_53759248的博客 4184

基于 Schema 多租户,如何存储每年10亿考勤打卡数据

对于人力资源 SAAS 系统来说,数据量最大的服务莫过于考勤打卡,假设SAAS系统有4000个公司订购,一天200w日活员工用户,一天400w打卡量(早晚各一次),那么一年估计有10亿左右的打卡数据量(每年预计工作日 230~250 天左右),那么如何存储10亿考勤打卡数据就是个问题,接下来介绍一下基于Schema进行数据隔离的SAAS系统如何应对这数据量的存储。首先,用户订购注册SAAS系统就会在认证中心保存好该租户(company_id)和对应的业务Schema名称。

保持学习 896

1亿数据 redis 内存_10亿数据量只需要100MB内存,redis的位存储为什么这么牛?

本文主要和大家分享一下redis的高级特性:bit位操作。力求让大家彻底学会使用redis的bit位操作并掌握其底层实现原理!主要包含以下内容:redis位操作命令示例底层数据结构分析为什么他的算法时间复杂度是O(1)?10亿数据量需要多大的存储空间?redis位操作适合哪些应用场景?文章内容较长,建议大家收藏后持续阅读,点击右上角关注,获取更多技术干货文章!本文redis试验代码基于如下环境:操...

weixin_33138569的博客 1204

Redis 10亿数据量只需要100MB内存,是如何存储的?

你知道的越多,不知道的就越多,业余的像一棵小草!你来,我们一起精进!你不来,我和你的竞争对手一起精进!编辑:业余草来源:toutiao.com/i6767642839267410445推...

xmt1139057136的专栏 2508

StarRocks分区分桶实战:如何为你的10亿数据表设计最佳存储策略?

本文深入探讨了StarRocks分区分桶在10亿数据存储设计中的关键策略,通过实战案例和量化公式,帮助开发者优化查询性能和管理效率。文章详细介绍了分区设计、分桶策略及高级技巧,为大数据处理提供黄金法则。

weixin_30292843的博客 388

DNA存储数据,峰哥身价暴涨10亿

点击上方 "大数据肌肉猿"关注,星标一起成长后台回复【加群】,进入高质量学习交流群2021年大数据肌肉猿公众号奖励制度昨天上班在谷歌查一个存储优化问题的时候,突然想到一...

a934079371的博客 842

10亿订单数据的架构设计

Hive:对应大部分的冷数据,如80%数据其实是间隔久远的历史数据,用户查询单个订单的详情内容概率非常低,大部分场景可能是对历史数据统计等。Hash:如状态等关键字段经常被更新,可以考虑将订单设计为Hash的形式:rediskey:订单号,内容key:订单的字段,内容value:字段的值。ES:小部分冷数据(如15%),如半年内的订单,用户会偶尔查询下订单的详情,此时查询的效率不能太慢。比如当天的订单、未完成的订单等,此类数据是用户操作的热点数据,可以再次进行分开存储。分片存储:如对订单号进行哈希分片。

u010712367的博客 1252

1亿数据 redis 内存_10亿数据量只需要100MB内存,Redis的位存储为什么这么牛?

本文主要和大家分享一下redis的高级特性:bit位操作。本文redis试验代码基于如下环境:操作系统:Mac OS 64位 版本:Redis 5.0.7 64 bit 运行模式:standalone mode# redis位操作reids位操作也叫位数组操作、bitmap,它提供了SETBIT、GETBIT、BITCOUNT、BITTOP四个命令用于操作二进制位数组。先来看一波基本操作...

weixin_35076078的博客 282

10分钟搞懂:亿级用户的分布式数据存储解决方案

10分钟搞懂:亿级用户的分布式数据存储解决方案

wangchaoqi1985的博客 215

10亿数据量只需要100MB内存,Redis的位存储为什么这么牛?

来源:toutiao.com/i6767642839267410445本文主要和大家分享一下redis的高级特性:bit位操作。力求让大家彻底学会使用redis的bit位操作并掌握其底层实...

Java笔记虾 698

10亿数据量只需要100MB内存,redis的位存储为什么这么牛?

来源 toutiao.com/i6767642839267410445本文主要和大家分享一下redis的高级特性:bit位操作。本文redis试验代码基于如下环境:操作系统:Mac OS...

emprere的博客 271

10分钟搞懂:亿级用户的分布式数据存储解决方案!

分布式数据库和分布式存储是分布式系统中难度最大、挑战最大,也是最容易出问题的地方。互联网公司只有解决分布式数据存储的问题,才能支撑更多次亿级用户的涌入。 接下来,你将花费十分钟掌握以下三方面内容:1、MySQL复制:包括主从复制和主主复制;2、数据分片:数据分片的原理、分片的方案、分片数据库的扩容;3、数据库分布式部署的几种方案。 一、MySQL复制 1.MySQL的主从复制MySQL的主从...

weixin_30418341的博客 950
上一篇: 利用Openssl生成证书
下一篇: docker
Forston
博客等级 码龄16年 17粉丝 17原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值