如何设计大量数据查重

本文探讨了在固定时间内内存和CPU执行效率有限的情况下,如何高效处理大量数据的查重和去重问题。介绍了几种实用的算法,包括利用ConcurrentHashMap进行内存同步操作、使用布隆过滤器减少内存占用、通过BitMap统计不重复数据个数以及采用hash分组方法对大规模数据进行查重。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

至少在现阶段内存和CPU的执行效率在固定时间内是有限的,大量的数据的查重和去重处理不可能同时在内存中进行。就像外部排序算法和内部排序算法差别很大,遇到此类大量数据查重问题对算法进行设计是有必要的。

ConcurrentHashMap

数据量不大的时候可以采用concurrentHashMap来操作,在内存中对数据进行同步的CRUD操作。

这种做法的好处是很明显的,逻辑处理很简单易懂。但是会产生大量的小对象,小对象会存放在新生代,新生代一般采用复制算法,大量不消亡的小对象在每次GC的时候都对JVM的性能产生灾难性的影响。这是我们不能接受的。

布隆过滤器

布隆过滤器是一种采用hash法进行查重的工具。它将每一条数据进行n次独立的hash处理,每次处理得到一个整数,总共得到n个整数。使用一个很长的数组表示不同的整数,每一次插入操作把这n个整数对应的位置的0设置为1(如果已经被设置为1则不变)。下次查找的时候经过同样的计算,如果这几个位置都是1则说明已经存在。

布隆过滤器的优点是使用方便,因为并不将key存放进内存所以十分节省空间,多个hash算法无关,可以并发执行效率高。缺点也是显而易见的,这种算法是可能出现错误,有误判率这种概念。通过hash的次数我们可以降低误判率,但是不能保证没有误判的情况。

BitMap 

比如有2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。

一个数字的状态只有三种,分别为不存在,只有一个,有重复。因此,我们只需要2bits就可以对一个数字的状态进行存储了,假设我们设定一个数字不存在为00,存在一次01,存在两次及其以上为11。那我们大概需要存储空间几十兆左右。接下来的任务就是遍历一次这2.5亿个数字,如果对应的状态位为00,则将其变为01;如果对应的状态位为01,则将其变为11;如果为11,,对应的转态位保持不变。

最后,我们将状态位为01的进行统计,就得到了不重复的数字个数,时间复杂度为O(n)。

hash分组

如果有两份50G的数据,要查重,内存4G,怎么查?

想法是先将50G的数据分别做hash%1000,分成1000个文件,理论上hash做得好那么这1000个文件的大小是差不多接近的。如果有重复,那么A和B的重复数据一定在相对同一个文件内,因为hash结果是一样的。将1000个文件分别加载进来,一一比对是否有hash重复。这种想法是先把所有数据按照相关性进行分组,相关的数据会处于同样或者接近的位置中,再将小文件进行对比。

有1千万条短信,找出重复出现最多的前10条?

可以用哈希表的方法对1千万条分成若干组进行边扫描边建散列表。第一次扫描,取首字节,尾字节,中间随便两字节作为Hash Code,插入到hash table中。并记录其地址和信息长度和重复次数,1千万条信息,记录这几个信息还放得下。同Hash Code且等长就疑似相同,比较一下。相同记录只加1次进hash table,但将重复次数加1。一次扫描以后,已经记录各自的重复次数,进行第二次hash table的处理。用线性时间选择可在O(n)的级别上完成前10条的寻找。分组后每份中的top10必须保证各不相同,可hash来保证,也可直接按hash值的大小来分类。

 

### 毕业设计作业查重方法或工具 #### 方法概述 为了实现高效的毕业设计作业查重,可以采用多种技术手段来检测文本相似度以及代码重复率。这些方法通常基于自然语言处理技术和算法模型,通过比较文档之间的语义特征或者语法结构来进行匹配分析。 一种常见的做法是使用余弦相似度计算法[^1],这种方法通过对两份文件向量化表示之后再求解它们之间夹角余弦值大小从而判断其相近程度;另一种则是编辑距离算法如Levenshtein Distance,在字符串层面衡量差异并据此评估可能存在的剽窃现象。此外还有专门针对编程语言特性的AST(Abstract Syntax Tree)对比方式可用于源代码类别的抄袭核查工作当中[^2]。 #### 技术栈选择 当考虑开发一套完整的查重解决方案时, 需要选取合适的技术框架作为支撑基础。Java作为一种成熟稳定的企业级应用开发语言提供了丰富的库支持和良好的性能表现 , 结合Spring Boot微服务架构模式能够快速搭建起具备RESTful API接口调用能力的服务端应用程序实例[^3]; 而Python由于其简洁易读的语法特性加上Flask轻量级Web框架则更适合于原型迭代周期较短的小型项目场景下试验新型功能模块的设计思路验证过程. #### 数据存储方案 考虑到系统运行过程中会产生大量的待检材料及其解析后的中间状态数据对象存取需求, MySQL关系型数据库因其事务一致性保障机制强健可靠而成为首选候选之一用来持久化保存重要业务实体记录信息; 同时MyBatis ORM映射工具可以帮助简化SQL操作复杂度提升开发效率减少潜在错误发生几率. ```python from flask import Flask, request, jsonify import pymysql app = Flask(__name__) @app.route('/check_similarity', methods=['POST']) def check_similarity(): data = request.json text1 = data['text1'] text2 = data['text2'] # 假设此处有具体的相似度计算逻辑 similarity_score = calculate_cosine_similarity(text1, text2) return jsonify({"similarity": similarity_score}) def calculate_cosine_similarity(text_a, text_b): # 实现余弦相似度的具体函数体... pass if __name__ == '__main__': app.run(debug=True) ``` 上述示例展示了一个简单的基于Flask的应用程序如何接收两个输入文本并通过自定义方法返回它们间的相似分数。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值