如何处理海量数据文件以及大文件数据查找

2023-11-12

目录

一.处理海量整数文件

①问:假定有40亿个无符号整数,判断某数据是否在其中?

②问:假定有40亿个无符号整数,找到只出现一次的数据,两次,三次...?

③问:两个文件各有100亿个整数,只有1G内存,找交集整数?

二.处理海量数据(非整数)文件

①问:超过100G大小的日志文件,存放的都是IP地址,求其中出现次数最多的IP地址?

求Top K个地址?

②问:两个文件分别有100亿个字符串,内存大小为1G,求交集字符串?(精确和近似)


一.处理海量整数文件

①问:假定有40亿个无符号整数,判断某数据是否在其中?

如果是使用遍历的思想 ,那么时间复杂度为O(n)。

就算数据已经排好序,使用二分查找时间复杂度也有O(log^n)。

不管是哪种,面对40亿个数据其效率都不会太高。

这时,使用位图+哈希思想解决就很重要。因为是无符号整数,正好一个数映射一个比特位(相当于直接定址法),而且不会出现哈希冲突。

当找寻数据时,只需要在位图中找到该整数对应的比特位,如果为1说明有,0说明没有。

当然,前提是整数进文件时就已经建立位图了,否则查找时再建立位图还是要遍历文件。 

如果是40亿个整数,最多就需要40亿个比特位,即476MB。换句话说就是利用空间换时间。

②问:假定有40亿个无符号整数,找到只出现一次的数据,两次,三次...?

这时一个位图已经无法满足需求,因为一个位图只能通过0和1判断数据是否存在。

那么使用两个位图呢?

同样,一个整数只会映射一个比特位,在两个位图中会映射同样的比特位,这两个比特位正好可以用于记录数据出现的次数。同样的整数第一次映射时置为0 1,第二次为1 0,第三次为1 1。

此时两个位图最多判断出现3次的整数,如果需要找到出现更多次的使用更多的位图即可。

图例如下:

③问:两个文件各有100亿个整数,只有1G内存,找交集整数?

虽然各有100亿个整数,但是int取值最大范围为正负21亿左右,共有约42亿个数据。

因此,这个问题还是使用位图+哈希来解决。

先取一个文件全部整数进行哈希映射,之后另一个文件在哈希映射中找比特位为1的即可。

二.处理海量数据(非整数)文件

①问:超过100G大小的日志文件,存放的都是IP地址,求其中出现次数最多的IP地址?

求Top K个地址?

数据是日志非整数,所以已经无法通过位图直接解决。同时数据过大,内存中显然无法直接装下。

这时,我们应该通过使用哈希切分思想来解决这个问题。

首先把文件分成足够多的小份,每一小份都应该是内存能直接处理的大小,且小文件数量要合理。如果数量过少,那么数据分配不平均,如果数量过多,会造成资源浪费。

我们假设分成1000份。

之后把大文件中数据通过哈希函数映射到相应的小文件中。因为同样的数据映射的是同一份小文件。因此所有相同的数据一定在同一份文件中

之后在内存中找到小文件中出现次数最多的数据。再将这个数据与其他小文件中次数最多的数据比较,找到整个大文件中出现次数最多的数据。

对于Top K问题,将每份小文件中出现次数最多的数据建立一个最小堆即可。

图例如下:

 

②问:两个文件分别有100亿个字符串,内存大小为1G,求交集字符串?(精确和近似)

 精确算法:按照哈希切分思想即可,将两个文件数据通过哈希映射分成内存能处理的小份文件。再将两个文件中同样编号的小文件进行对比即可。

图示如下:

近似算法:用一份文件数据建立布隆过滤器,之后另一份文件数据再通过该布隆过滤器进行判断即可。

因为布隆过滤器的特性,判断存在的可能存在,判断不存在的一定不存在。

与精确算法相比,近似算法空间消耗更低,但存在误判率

编译器永远比你懂微观优化,只能向它不擅长的方向努力——未名 


如有错误,敬请斧正

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何处理海量数据文件以及大文件数据查找 的相关文章

  • Hash table and application in java

    查找的效率取决于在查找是比较的次数 次数越少效率越高 反之越低 最理想的情况是无需比较 一次存取便能找到所查找的记录 根据对应关系f找到给定值K的像f K hash function 应运而生 由此思想建的表称为hash table 集合h
  • 微软2013暑假实习生笔试题

    自己mark一下 以作后备 下面提交原文链接 原文博客 部分题目答案不确定 会持续更新 1 Which of the following calling convention s support s supportvariable leng
  • SDUT--OJ《数据结构与算法》实践能力专题训练6 图论

    A 数据结构实验之图论一 基于邻接矩阵的广度优先搜索遍历 Description 给定一个无向连通图 顶点编号从0到n 1 用广度优先搜索 BFS 遍历 输出从某个顶点出发的遍历序列 同一个结点的同层邻接点 节点编号小的优先遍历 Input
  • 算法系列15天速成——第八天 线性表【下】

    一 线性表的简单回顾 上一篇跟大家聊过 线性表 顺序存储 通过实验 大家也知道 如果我每次向 顺序表的头部插入元素 都会引起痉挛 效率比较低下 第二点我们用顺序存储时 容 易受到长度的限制 反之就会造成空间资源的浪费 二 链表 对于顺序表存
  • 以太坊系列之十五: 以太坊数据库

    以太坊数据库中都存了什么 以太坊使用的数据库是一个NOSQL数据库 是谷歌提供的开源数据leveldb 这里尝试通过分析以太坊数据库存储了什么来分析以太坊可能为我们提供哪些关于区块链的API 存储内容 NOSQL是一个key value数据
  • 如何防止过拟合和欠拟合

    过拟合和欠拟合是模型训练过程中经常出现的问题 两种情况正好相反 现将两者的定义及如何防止进行简要总结 1 过拟合 1 1 定义 是指模型对于训练数据拟合呈现过当的情况 反映到评估指标上就是模型在训练集上的表现很好 但是在测试集上的表现较差
  • 人工智能概念

    人工智能概念 人工智能就是用人工方法在机器 计算机 上实现的智能 或称机器智能 即是研究如何用计算机来表示和执行人类的智能活动 以模拟人脑所从事的推理 学习 思考和规划等思维活动 并解决需要人类的智力才能处理的复杂问题 如医疗诊断 管理决策
  • OJ-合并两个有序链表

    题目描述 代码如下 Definition for singly linked list struct ListNode int val struct ListNode next struct ListNode mergeTwoLists s
  • 用指针访问一维数组

    文章目录 顺序查找 数组方式实现 指针实现方式 对一位数组元素的访问有三种方式 指针变量的关系运算 引例 数组实现方式 主函数 指针实现方式 主函数 一维数组作为函数的参数 实际应用 顺序查找 要求用指针实现 在整数集合r中顺序查找与给定值
  • Redis—列表(List)、集合(Set)、哈希(Hash)、有序集合 Zset

    Redis 列表List 集合Set 哈希Hash 有序集合 Zset 列表List 单键多值 常用命令 数据结构 Redis 集合 Set 常用命令 数据结构 Redis 哈希 Hash 常用命令 数据结构 Redis 有序集合 Zset
  • 二叉树结构的建立与遍历

    实验项目 1 编写建立二叉树的二叉链表存储结构 左右链表示 的程序 并以适当的形式显示和保存二叉树 2 完成二叉树的7种遍历操作 3 给定一个二叉树 编写算法完成下列应用 1 判断其是否为完全二叉树 2 求二叉树中任意两个结点的公共祖先 输
  • 【试题】排列组合

    在写一个远程的代码 如果本地有M个显示器 远程有N个显示器 M lt N 依据分辨率 显示器刷新频率等要求 需要对远程的N个显示器进行最佳分辨率修改 之后 需要从N个远程显示器中选择M个 跟本地显示器进行一对一的匹配 即从 A N M N
  • BCrypt密码加密的简单使用

    一 BCrypt基础 在一个项目中 只要涉及用户的登陆注册 就涉及到用户密码的保护 用户的密码存在数据库是对管理员是透明的 所以为了防止管理员泄露密码 提高用户密码的安全性 我们通常会对用户密码进行加密后再存入数据库 目前MD5与Bcryp
  • 雪糕的最大数量 排序+贪心

    雪糕的最大数量 雪糕的最大数量 题目描述 样例 数据范围 思路 代码 题目描述 夏日炎炎 小男孩 Tony 想买一些雪糕消消暑 商店中新到 n 支雪糕 用长度为 n 的数组 costs 表示雪糕的定价 其中 costs i 表示第 i 支雪
  • 牛客剑指offer刷题其他算法篇

    文章目录 构建乘积数组 题目 思路 代码实现 第一个只出现一次的字符
  • 【数据结构入门精讲 | 第二篇】一文讲清算法复杂度

    上篇文章中我们引入了算法 数据结构 数据类型等概念 而要想衡量一个算法与数据结构是否为优质的 就需要一个衡量标准 这个衡量标准也是在我们实现一个好的算法时要遵循的原则 目录 基本概念 渐进性态 渐进性态数学表征 算法复杂度的运算 顺序搜索算
  • 布隆过滤器

    布隆过滤器地提出 我们在使用新闻客户端看新闻时 它会给我们不停地推荐新的内容 它每次推荐时要去重 去掉 那些已经看过的内容 问题来了 新闻客户端推荐系统如何实现推送去重的 用服务器记录了用 户看过的所有历史记录 当推荐系统推荐新闻时会从每个
  • 【数据结构】双链表的定义和操作

    目录 1 双链表的定义 2 双链表的创建和初始化 3 双链表的插入节点操作 4 双链表的删除节点操作 5 双链表的查找节点操作 6 双链表的更新节点操作 7 完整代码 嗨 我是 Filotimo 很高兴与大家相识 希望我的博客能对你有所帮助
  • C++ AVL树(四种旋转,插入)

    C AVL树 四种旋转 插入 一 AVL树的概念及性质 二 我们要实现的大致框架 1 AVL树的节点定义 2 AVL树的大致框架 三 插入 1 插入逻辑跟BST相同的那一部分 2 修改平衡因子
  • 浅谈归并排序:合并 K 个升序链表的归并解法

    在面试中遇到了这道题 如何实现多个升序链表的合并 这是 LeetCode 上的一道原题 题目具体如下 用归并实现合并 K 个升序链表 LeetCode 23 合并K个升序链表 给你一个链表数组 每个链表都已经按升序排列 请你将所有链表合并到

随机推荐