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

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(使用前将#替换为@)

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

  • 数据结构----链式栈

    目录 前言 链式栈 操作方式 1 存储结构 2 初始化 3 创建节点 4 判断是否满栈 5 判断是否空栈 6 入栈 7 出栈 8 获取栈顶元素 9 遍历栈 10 清空栈 完整代码 前言 前面我们学习过了数组栈的相关方法 链接 线性表 栈 栈
  • Leetcode力扣题解 - 30.串联所有单词的子串

    地址 30 串联所有单词的子串 力扣 LeetCode 一 思路 本题关键点是 1 所有关键词长度一致 2 匹配的是所有关键词连接起来的 大体思路 那么我们就可以从字符串头开始 每次只匹配关键词总长度个字符 如果匹配成功 在返回的数组中保存
  • DDP入门

    DDP 即动态动态规划 可以用于解决一类带修改的DP问题 我们从一个比较简单的东西入手 最大子段和 带修改的最大子段和其实是常规问题了 经典的解决方法是用线段树维护从左 右开始的最大子段和和区间最大子段和 然后进行合并 现在我们换一种方法来
  • 数据结构与算法学习总结(六)——字符串的模式匹配算法

    基本概念 字符串是一种特殊的线性表 即元素都是 字符 的线性表 字符是组成字符串的基本单位 字符的取值依赖于字符集 例如二进制的字符集为0 1 则取值只能为 0 1 再比如英语语言 则包括26个字母外加标点符号 例如 abcde 就是一个字
  • 手把手教你实现一个向量

    文章目录 什么是向量 向量提供哪些接口 实现 宏定义 定义类 成员变量 构造函数与析构函数 构造函数 析构函数 成员函数 size get r put r e expand insert r e remove lo hi remove r
  • 如何根据链表节点数据大小对链表节点进行排序

    对链表排序有两种方法 1 比较了两个节点的大小后 对指针进行改变 从而交换节点的顺序 2 比较了两个节点的大小后 只交换数据域 而不改变指针 从而交换节点的顺序 第二种办法比较简单 本文主要对第二种方法进行讲解 链表节点排序算法 采用 冒泡
  • 算法系列15天速成——第八天 线性表【下】

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

    学习数据结构与算法 还是很有必要看几本相关的书籍 但根据不同基础的人 合适看的书也不一样 因此 针对不同层次 不同语言的人 推荐几本市面上口碑不错的书 1 入门级 针对刚入门的同学 建议不要急着去看那些经典书 像 算法导论 算法 这些比较经
  • 以太坊系列之十五: 以太坊数据库

    以太坊数据库中都存了什么 以太坊使用的数据库是一个NOSQL数据库 是谷歌提供的开源数据leveldb 这里尝试通过分析以太坊数据库存储了什么来分析以太坊可能为我们提供哪些关于区块链的API 存储内容 NOSQL是一个key value数据
  • UE4命令行使用,解释

    命令行在外部 从命令行运行编辑项目 1 导航到您的 LauncherInstall VersionNumber Engine Binaries Win64 目录中 2 右键单击上 UE4Editor exe 的可执行文件 并选择创建快捷方式
  • 4Sum

    Given an array S of n integers are there elements a b c and d in S such that a b c d target Find all unique quadruplets
  • 机器学习算法GBDT的面试要点总结-上篇

    1 简介 gbdt全称梯度提升决策树 在传统机器学习算法里面是对真实分布拟合的最好的几种算法之一 在前几年深度学习还没有大行其道之前 gbdt在各种竞赛是大放异彩 原因大概有几个 一是效果确实挺不错 二是即可以用于分类也可以用于回归 三是可
  • 【试题】排列组合

    在写一个远程的代码 如果本地有M个显示器 远程有N个显示器 M lt N 依据分辨率 显示器刷新频率等要求 需要对远程的N个显示器进行最佳分辨率修改 之后 需要从N个远程显示器中选择M个 跟本地显示器进行一对一的匹配 即从 A N M N
  • 基数排序代码实现

    详情请看排序总结 传送门 https blog csdn net m0 52711790 article details 121914543 基数排序的知识点我就不贴出来 相信都能搜到对应概念解释 下面就直接上代码 代码解释其实也很清晰了
  • 一致性哈希算法,hash(key)是负值时,会出现异常吗?

    一致性哈希算法 hash key 是负值时 会出现异常吗 一致性哈希算法中 哈希函数hash key 的返回值通常是一个非负整数 如果hash key 返回负值 则可能会出现一些问题 例如无法正确地映射对象到哈希环上的位置 或者无法正确地找
  • 数组实现循环队列(增设队列大小size)

    目录 一 前言 1 如何实现循环 2 如何判断队列为空 3 如何判断队列为满 二 循环队列的结构定义 三 循环队列的创建及其初始化 四 入队 五 出队 六 取队头元素 七 取队尾元素 八 循环队列判空 九 循环队列判满 十 循环队列销毁 一
  • 布隆过滤器

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

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

    C AVL树 四种旋转 插入 一 AVL树的概念及性质 二 我们要实现的大致框架 1 AVL树的节点定义 2 AVL树的大致框架 三 插入 1 插入逻辑跟BST相同的那一部分 2 修改平衡因子
  • 按照层次遍历结果打印完全二叉树

    按照层次遍历结果打印完全二叉树 按照推论结果 l 层首个节点位置 2 h l 1 l 层节点间距 2 h l 1 1 编码实现 public static

随机推荐