当前位置: 首页 > news >正文

200W数据需要去重,如何优化?

优化去重逻辑的时间取决于多个因素,包括数据量、数据结构、硬件性能(CPU、内存)、去重算法的实现方式等。以下是对优化去重逻辑的详细分析和预期优化效果:


1. 去重逻辑的性能瓶颈

  • 时间复杂度:使用HashSet去重的时间复杂度为O(n),其中n是数据量。
  • 内存占用HashSet需要将数据全部加载到内存中,如果数据量过大(如200万条),可能会占用大量内存,甚至导致GC(垃圾回收)频繁触发,影响性能。
  • 数据分布:如果数据的唯一标识(如getUniqueKey())分布不均匀,可能会导致HashSet的哈希冲突增加,影响性能。

2. 优化去重逻辑的预期效果

  • 使用HashSet去重:对于200万条数据,HashSet去重的理论时间通常在几秒到十几秒之间,具体取决于硬件性能。
  • 并行去重:如果使用多线程并行去重,可以将时间进一步缩短。例如,使用8个线程并行处理,理论上可以将时间减少到原来的1/8左右。
  • 内存优化:如果内存不足,可以采用分批去重的方式,减少内存占用,但可能会略微增加时间。

3. 优化去重的具体实现

  • 单线程去重
  Set<String> uniqueSet = new HashSet<>();List<Data> uniqueDataList = dataList.stream().filter(data -> uniqueSet.add(data.getUniqueKey())).collect(Collectors.toList());

对于200万条数据,单线程去重的时间通常在5-10秒左右(取决于硬件性能)。

  • 多线程并行去重
    将数据分片,使用多线程并行去重。

    int threadPoolSize = 8; // 根据CPU核心数调整
    ExecutorService executor = Executors.newFixedThreadPool(threadPoolSize);
    List<Future<List<Data>>> futures = new ArrayList<>();
    int chunkSize = dataList.size() / threadPoolSize;
    for (int i = 0; i < threadPoolSize; i++) {int start = i * chunkSize;int end = (i == threadPoolSize - 1) ? dataList.size() : (i + 1) * chunkSize;List<Data> subList = dataList.subList(start, end);futures.add(executor.submit(() -> {Set<String> localSet = new HashSet<>();return subList.stream().filter(data -> localSet.add(data.getUniqueKey())).collect(Collectors.toList());}));
    }
    List<Data> uniqueDataList = new ArrayList<>();
    for (Future<List<Data>> future : futures) {uniqueDataList.addAll(future.get());
    }
    executor.shutdown();
    

    使用多线程并行去重,时间可以缩短到1-3秒左右。


4. 进一步优化

  • 使用更高效的数据结构:如果getUniqueKey()是数值类型,可以使用Trove库的THashSet,它比HashSet更高效。
  • 减少数据拷贝:在去重时,尽量避免对数据的多次拷贝,直接操作原始数据。
  • 使用布隆过滤器:如果允许一定的误判率,可以使用布隆过滤器(Bloom Filter)进行快速去重。

5. 测试和验证

  • 硬件环境:在测试时,确保硬件环境(CPU、内存、磁盘)与实际生产环境一致。
  • 数据分布:使用真实数据或模拟数据测试,确保数据分布与实际场景一致。
  • 性能监控:使用性能分析工具(如JProfiler、VisualVM)监控去重逻辑的性能瓶颈。

6. 预期优化效果总结

  • 单线程去重:5-10秒。
  • 多线程并行去重:1-3秒。
  • 进一步优化(如布隆过滤器):可以进一步缩短时间,但可能会引入一定的误判率。

示例代码(多线程并行去重)

public List<Data> deduplicate(List<Data> dataList, int threadPoolSize) throws Exception {ExecutorService executor = Executors.newFixedThreadPool(threadPoolSize);List<Future<List<Data>>> futures = new ArrayList<>();int chunkSize = dataList.size() / threadPoolSize;for (int i = 0; i < threadPoolSize; i++) {int start = i * chunkSize;int end = (i == threadPoolSize - 1) ? dataList.size() : (i + 1) * chunkSize;List<Data> subList = dataList.subList(start, end);futures.add(executor.submit(() -> {Set<String> localSet = new HashSet<>();return subList.stream().filter(data -> localSet.add(data.getUniqueKey())).collect(Collectors.toList());}));}List<Data> uniqueDataList = new ArrayList<>();for (Future<List<Data>> future : futures) {uniqueDataList.addAll(future.get());}executor.shutdown();return uniqueDataList;
}

通过以上优化,去重逻辑的时间可以从原来的几十秒优化到几秒甚至更短。

相关文章:

200W数据需要去重,如何优化?

优化去重逻辑的时间取决于多个因素&#xff0c;包括数据量、数据结构、硬件性能&#xff08;CPU、内存&#xff09;、去重算法的实现方式等。以下是对优化去重逻辑的详细分析和预期优化效果&#xff1a; 1. 去重逻辑的性能瓶颈 时间复杂度&#xff1a;使用HashSet去重的时间复…...

使用免费IP数据库离线查询IP归属地

一、准备工作 1.下载免费IP数据库 首先&#xff0c;访问 MaxMind官网&#xff08;https://www.maxmind.com/en/home&#xff09;如果你还没有MaxMind账号&#xff0c;可以通过此链接地址&#xff08;https://www.maxmind.com/en/geolite2/signup&#xff09;进行账号注册&…...

【游戏】【客户端性能测试】

待续… 一、 常见指标 1. 越高越好 FPS 2. 越低越好 网络流量CPU内存&#xff08;PSS&#xff0c; momo&#xff09;Drawcalls三角形数耗电量包体大小 二、 游戏体验 1. 直接体感 游戏花屏闪退卡顿延迟 2. 可能原因 内存超标Drawcall数量多FPS波动严重CPU占用高居不下…...

软考中级-数据库-3.3 数据结构-树

定义:树是n(n>=0)个结点的有限集合。当n=0时称为空树。在任一非空树中,有且仅有一个称为根的结点:其余结点可分为m(m>=0)个互不相交的有限集T1,T2,T3...,Tm…,其中每个集合又都是一棵树,并且称为根结点的子树。 树的相关概念 1、双亲、孩子和兄弟: 2、结点的度:一个结…...

typora高亮方案+鼠标侧键一键改色

引言 在typora里面有一个自定义的高亮, <mark></mark>>但是单一颜色就太难看了, 我使用人工智能, 搜索全网艺术家, 汇集了几种好看的格式,并且方便大家侧键一键 调用, 是不是太方便啦 ! 示例 午夜模式 春意盎然 深海蓝调 石墨文档 秋日暖阳 蜜桃宣言 使用方法 …...

【CSS】Tailwind CSS 与传统 CSS:设计理念与使用场景对比

1. 开发方式 1.1 传统 CSS 手写 CSS&#xff1a;你需要手动编写 CSS 规则&#xff0c;定义类名、ID 或元素选择器&#xff0c;并为每个元素编写样式。 分离式开发&#xff1a;HTML 和 CSS 通常是分离的&#xff0c;HTML 中通过类名或 ID 引用 CSS 文件中的样式。 示例&#…...

Linux(Centos 7.6)命令详解:vim

1.命令作用 vi/vim 是Linux 系统内置不可或缺的文本编辑命令&#xff0c;vim 是vi 的加强版本&#xff0c;兼容vi 的所有指令&#xff0c;不仅能编辑文本&#xff0c;而且还具有shell 程序编辑的功能&#xff0c;可以不同颜色的字体来辨别语法的正确性。 2.命令语法 usage: …...

记录一次wifi版有人物联串口服务器调试经过

1、首先买了一个华为的wifi路由器&#xff0c;连接上以后&#xff0c;设置好网络名字和wifi密码 2、用网线连接串口服务器&#xff0c;通过192.168.1.1登录&#xff0c;进行配置 找到无线客户端配置&#xff0c;先在基本配置中打开5G配置&#xff0c;然后再去5.8G配置中设置 …...

QWQ大模型评测榜单

评测榜单说明 在数学推理基准AIME24上&#xff0c;QwQ-32B达到了79.5分&#xff0c;几乎与DeepSeek-R1-617B的79.8分持平&#xff0c;远超OpenAI o1-mini的63.6分&#xff0c;及相同尺寸的R1蒸馏模型。 在编程能力方面&#xff0c;QwQ-32B 在LiveCodeBench上获得了63.4分&…...

【CXX】5.4 属性

命名空间 顶层的 cxx::bridge 属性宏接受一个可选的命名空间参数&#xff0c;用于控制生成外部 Rust 项的 C 命名空间&#xff0c;以及期望找到外部 C 项的命名空间。 #[cxx::bridge(namespace "path::of::my::company")] mod ffi {extern "Rust" {type…...

c++雅兰亭库 (yalantinglibs) 介绍及使用(序列化、json和结构体转换、协程

c雅兰亭库 (yalantinglibs) 介绍及使用(序列化、json和结构体转换、协程)-CSDN博客 雅兰亭库(yalantinglibs)介绍 雅兰亭库&#xff0c;名字很优雅&#xff0c;也很强大。它是阿里开源的一个现代C基础工具库的集合, 现在包括 struct_pack, struct_json, struct_xml, struct_yam…...

3.6 登录认证

登录功能 登录思路 联调测试 登录校验 问题&#xff1a;在未登录情况下&#xff0c;我们也可以直接访问部门管理、员工管理等功能。 登录标记 用户登录成功之后&#xff0c;每一次请求中&#xff0c;都可以得到该标记。 统一拦截 过滤器Filter拦截器Interceptor 会话技术 会…...

宇树科技嵌入式面试题及参考答案(春晚机器人的公司)

目录 设计一个带看门狗(Watchdog)的嵌入式系统,描述故障恢复流程 在资源受限的 MCU 上实现 OTA 升级功能,描述关键设计点 如何实现 OTA(空中升级)功能?描述固件校验和回滚机制的设计要点 推挽输出与开漏输出的区别?举例说明其在 GPIO 控制中的应用 UART、SPI、I2C …...

Android 存储路径详解

内部存储空间中的应用私有目录&#xff08;data/data/app package name&#xff09; WebView 缓存页面信息&#xff0c;SharedPreferences 和 SQLiteDatabase 持久化应用相关数据等当用户卸载 App 时&#xff0c;系统自动删除 data/data 目录下对应包名的文件夹及其内容。getF…...

Windows Server开启审计功能

Windows Server 也具备强大的审计功能&#xff0c;可以记录各种系统事件和用户活动&#xff0c;以满足安全审计、合规性要求和故障排除的需求。 Windows Server 的审计功能非常灵活和可配置&#xff0c;可以精确地记录您关心的事件类型。 一、Windows Server 审计功能概述 Wi…...

跟着 Lua 5.1 官方参考文档学习 Lua (10)

文章目录 5.2 – Coroutine Manipulationcoroutine.create (f)coroutine.resume (co [, val1, ])coroutine.running ()coroutine.status (co)例子&#xff1a;**协程的状态** coroutine.wrap (f)coroutine.yield () 5.3 – Modulesmodule (name [, ])require (modname)package.…...

C++文档识别接口如何实现 高效办公

数字化信息爆炸时代&#xff0c;办公效率的提升成为企业和个人的迫切需求。人工智能技术的飞速发展&#xff0c;为我们带来了前所未有的便利&#xff0c;文档识别接口便是其中之一。 与传统的人工手动录入相比&#xff0c;文档识别接口优势显著。人工手动录入&#xff0c;不仅耗…...

【一维数组】1228: 拉手游戏

题目描述 N个小朋友手拉手站成一个圆圈&#xff0c;从第一个小朋友开始循环报数&#xff0c;报到M的那个小朋友退到圈外&#xff0c;然后他的下一位重新报"1"。这样继续下去&#xff0c;直到最后只剩下一个小朋友&#xff0c;他原来站在什么位置上呢&#xff1f; 输…...

准确--Centos最小化安装通过命令去修改ip和dns

在 CentOS 7 中&#xff0c;最小化安装后没有图形界面&#xff0c;你需要手动配置网络。可以按照以下步骤进行配置&#xff1a; 1. 查看网络接口名称 首先&#xff0c;查看当前的网络接口名称。你可以通过以下命令查看&#xff1a; ip addr在你提供的截图中&#xff0c;网络…...

FreeRTOS 任务间通信机制:队列、信号量、事件标志组详解与实验

1. FreeRTOS 消息队列 1.1 简介 ​ 队列是 任务间通信的主要形式&#xff0c;可用于在任务之间以及中断与任务之间传递消息。队列在 FreeRTOS 中具有以下关键特点&#xff1a; 队列默认采用 先进先出 FIFO 方式&#xff0c;也可以使用 xQueueSendToFront()实现 LIFO。FreeRT…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...