用bitSet做百万级ip去重
如果直接将几百万数据仍到bitset,内存是否够用?实际测试,600万ip放到一个bitSet中,jvm内存会爆。
所以,就简单做了下分组,构建一个HashMap<String, BitSet>,
以192.168.6.2为例,将192.168直接截取为字符串,当作hashmap的key,后2位补零为006002,将006002放入“192.168”分组的bitSet中。
适用场景:
这种构建bitSet的去重方式,适合判断某个ip是否在百万级的ip集合中。
不适用输入一个百万级ip集合,去重后输出这个结果集。
代码如下:
import java.util.BitSet;
import java.util.HashMap;
public class DistcIp {
public static void main(String[] args) {
HashMap<String, BitSet> groupBitSet=new HashMap<String, BitSet>();
//先遍历ip,
String ip1="192.168.0.3";
String ip2="192.168.0.4";
String ip3="192.162.0.6";
String ip4="192.162.0.6";
String ip5="192.157.0.4"; String[] strs=new String[] {ip1,ip2,ip3,ip4,ip5}; for (String cip : strs) {
String group=getBitSetGroup4IP(cip);
int value=getBitSetValue4IP(cip);
if(groupBitSet.containsKey(group)) {
groupBitSet.get(group).set(value);
}else {
BitSet bs= new BitSet();
bs.set(value);
groupBitSet.put(group, bs);
}
} String group2=getBitSetGroup4IP(ip1);
int value2=getBitSetValue4IP(ip1);
BitSet bs=groupBitSet.get(group2);
System.out.println(bs.get(value2)); String group3=getBitSetGroup4IP("192.168.0.1");
int value3=getBitSetValue4IP("192.168.0.1");
BitSet b3=groupBitSet.get(group3);
System.out.println(b3.get(value3));
} /**
* 用来构建BitSet数值;
* @param ip
* @return int
*/
static int getBitSetValue4IP(String ip){
String[] ips=ip.split("\\.");
if(ips.length!=4) return 0;
String tmp=formatVal(ips[2])+formatVal(ips[3]);
return Integer.valueOf(tmp);
} /**
* 用来构建BitSet分组;
* @param ip
* @return String
*/
String getBitSetGroup4IP(String ip){
String[] ips=ip.split("\\.");
if(ips.length!=4) return null;
return ips[0]+"."+ips[1];
} //这个是用来补零的,如:125.42.1.8 ->125.042.001.008
static String formatVal(String s) {
String res="";
char[] ca=s.toCharArray();
for(int i=ca.length;i<3;i++) {
res+="0";
}
return res+s;
}
}
用bitSet做百万级ip去重的更多相关文章
- 用FlexGrid做开发,轻松处理百万级表格数据
		
表格数据处理是我们项目开发中经常会遇到的设计需求之一,所需处理的数据量也较大,通常是万级.甚至百万级.此时,完全依赖平台自带的表格工具,往往无法加载如此大的数据量,或者加载得很慢影响程序执行. 那么, ...
 - 如何生成每秒百万级别的 HTTP 请求?
		
第一篇:<如何生成每秒百万级别的 HTTP 请求?> 第二篇:<为最佳性能调优 Nginx> 第三篇:<用 LVS 搭建一个负载均衡集群> 本文是构建能够每秒处理 ...
 - Netty系列之Netty百万级推送服务设计要点
		
1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...
 - Netty_Netty系列之Netty百万级推送服务设计要点
		
1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...
 - 【netty】Netty系列之Netty百万级推送服务设计要点
		
1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...
 - FW 每秒百万级别的 HTTP 请求 sung: 重型的(heavy-duty)、分布式的、多协议测试工具
		
本文是构建能够每秒处理 3 百万请求的高性能 Web 集群系列文章的第一篇.它记录了我使用负载生成器工具的一些经历,希望它能帮助每一个像我一样不得不使用这些工具的人节省时间. 负载生成器是一些生成用于 ...
 - 阿里云云盾抗下全球最大DDoS攻击(5亿次请求,95万QPS HTTPS CC攻击) ,阿里百万级QPS资源调度系统,一般的服务器qps多少? QPS/TPS/并发量/系统吞吐量
		
阿里云云盾抗下全球最大DDoS攻击(5亿次请求,95万QPS HTTPS CC攻击) 作者:用户 来源:互联网 时间:2016-03-30 13:32:40 安全流量事件https互联网资源 摘要: ...
 - Netty系列之Netty百万级推送服务设计要点(转)
		
1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...
 - 每秒处理3百万请求的Web集群搭建-如何生成每秒百万级别的 HTTP 请求?
		
本文是构建能够每秒处理 3 百万请求的高性能 Web 集群系列文章的第一篇.它记录了我使用负载生成器工具的一些经历,希望它能帮助每一个像我一样不得不使用这些工具的人节省时间. 负载生成器是一些生成用于 ...
 
随机推荐
- 第三次实验报告:使用Packet Tracer分析TCP连接建立过程
			
目录 1 实验目的 2 实验内容 3. 实验报告 3.1 建立网络拓扑结构 3.2 配置参数 3.3 抓包,分析TCP连接建立过程 4. 拓展 (不作要求,但属于加分项) 1 实验目的 使用路由器连接 ...
 - 实战django(二)--登录实现记住我
			
上节初步实现了登录和注册模块,这节我们进一步实现“记住我”功能. 大体功能分为以下模块: 1.在登录时如果勾选记住我,那么就将用户username存进cookie中,跳转到index页面: 2.此时, ...
 - Docker底层原理介绍
			
1.docker介绍 1.1什么是docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻 ...
 - Exif认识(二)
			
通过php获取exif信息后,像光圈和快门的值还需要转换下,才是我们常用看得懂的值 ApertureValue的值: 拍照时镜头的光圈. 单位是 APEX. 为了转换成普通的 F-number(F-s ...
 - tkinter事件键盘绑定
			
tkinter事件键盘绑定 from tkinter import * root=Tk() #创建一个框架,在这个框架中响应事件 frame=Frame(root, width=200,height= ...
 - govendor用法
			
为什么使用govendor go语言的依赖管理最主要的是版本控制问题. govendor是Golang的依赖包管理工具,它的出现可以避免不同用户在clone同一个项目后从外部获取不同依赖库版本的问题. ...
 - HTML Web Workers
			
Web worker 是运行在后台的 JavaScript,不会影响页面的性能. 什么是 Web Worker? 当在 HTML 页面中执行脚本时,页面是不可响应的,直到脚本已完成. Web work ...
 - ES6 Set和Map集合(六)
			
一.Set集合创建Set实例:let set = new Set();1.特性:a.Set本身是一个构造函数,用来生成Set数据结构[类比数组结构]b.Set函数可以接受具有Iterable接口的数据 ...
 - Eureka2.0集群环境
			
当有2个eureka注册中心构建eureka注册中心集群时,1:微服务的注册中心地址要写2个eureka注册中心的地址,以逗号分隔2:其中1个eureka注册中心A保留有微服务的注册信息,作为主注册中 ...
 - 利用Python读取图片exif敏感信息
			
众所周知,现在很多的照相机等软件,拍摄会有选项,是否包含位置信息等. 当然有的人会说,我在微信中查看图片exif信息并没有啊,这是因为你发送到微信服务器的时候,微信帮你完成了保密工作. 常见的图片中包 ...