cf过虚拟化代码_cf过虚拟化代码

2020CCF虚拟身份归一处理性能优化-冠军方案

团队介绍

  • 本次冠军方案由翼数所普拉斯团队分享,该团队在2020CCF数据湖赛道也取得了亚军成绩,让我们看看最优化大佬的专属自己的一套解决方案吧!学废了你也是冠军潜力种子选手!

赛题背景和任务

  • 背景:随着近年来互联网的高速发展,各种类型多样的网络应用程序呈现爆炸式增长,人们对于互联网的依赖迅速增长,与现实社会不同的是,用户可以通过网络虚拟身份而非真实身份实现所有的网络行为,网民拥有的网络虚拟身份组成了一个巨大的虚拟网络社区,社区中的虚拟身份可能有着直接或者间接的关系。
    移动互联网时代,每天都会产生海量的数据,如现实生活中的住宿、驾车、出行等,虚拟世界中的即时通讯、第三方支付等;数据量大、无统一的标识特征,导致各类数据零散、无法关联,如何自动分析并将相关数据的身份进行归一化,成为提升海量数据分析能力和分析效率的工作难点。
    本赛题目标为在从样本数据中,提取所有具有关联关系的虚拟身份信息进行归一化,识别多个属于同一个现实用户的所有虚拟身份,并将其合并到一起,最终生成一个虚拟身份库。
  • 任务:参赛者采用统计学理论方法、数据挖掘中的关联分析、图论相关算法完成虚拟身份归一化。

数据介绍

  • 数据简介:样本数据采用随机生成方式产生,用作后续模型计算。
  • 数据说明:提供两个数据样本集,分别账号样本集(accounts.txt)和关联样本集(relatins.txt)。
  • 【账号样本集】
    账号样本集,包含两个字段,分别为临时唯一id和账号字段(随机生成),两个字段采用空格分隔。

字段信息

类型

描述

Id

Long

全局唯一id

Account

string

账号名称

  • 【关联样本集】
    关联账号样本集,包含4个字段,分别为关联A账号临时唯一id、关联A账号账号字段、分别为关联B账号临时唯一id和关联B账号账号字段

字段信息

类型

描述

src_Id

Long

账号A全局唯一id

src_Account

string

账号A名称

dest_Id

Long

账号B全局唯一id

dest_Account

string

账号B名称

提交要求

  • 采用JAVA语言实现虚拟账号归一化,通过JVM配置内存约束,避免内存等因素对执行性能的影响(不要应用分布式计算框架实现)。
    代码编写采用Java SE 8,小版本在100以上。禁用类似通过JNI等手段调用本地库实现计算。
  • 参赛者在线提供可运行程序jar包(Runnable JAR File。注意执行jar包的执行方式为:java -jar -Xms2024m -Xmx2024m -Xmn1024m),样本数据文件accounts.txt,relations.txt存储在可运行程序包同级目录下(使用相对目录方式读取文件内容,无需将测试数据文件打到可运行jar包中,在测试过程中,会将测试文件与可运行程序包放到相同的目录下,可运行程序包在读取测试数据文件时需要注意控制相对目录),计算结果输出到同目录的result.txt文件中。
  • 参赛者以txt文件格式输出,具体字段为虚拟身份归一ID,虚拟身份账号字段(多个虚拟账号值存到当前字段中,各个虚拟账号之间通过逗号进行分割,统一身份id与虚拟身份账号之间采用空格分隔)。在计算结果中,对于每个簇,采用当前簇的最小账号的id作为整个簇的id,结果集按照uniqueid进行排序输出。具体示例请参考【输出结果示例】。
  • 参赛者需要严格按照排序规则进行文件的输出,平台在检查结果输出时将判别参赛者提交的文件的MD5值来检查是否输出的正确的结果。

字段信息

类型

描述

uniqueid

Long

虚拟账号全局唯一id

accounts

string

多虚拟账号(逗号分割)

-【输出结果示例】
1:ac3cc39016a628a5, 915cdc8925ad0bab,
93b63bb31a91726c,d6a5b95a735cb0d5,870bc291129ddc1c
2:aa9bac15560ca792,dd3dd92dd2b271ca,a6abbcbac29a649c,
3:c1d00bd2b61b835

评测标准

  • 同一时间段,只能运行一个可执行程序,避免多任务同时运行,降低对测试结果的影响。
  • 应用同一台机器进行测试,统一设置JVM信息(标准JVM为1G)。关于测试执行采用外置脚本启动测试,从发出运行命令开始计时,在捕获进程结束时捕获结束时间,两个时间的差作为程序执行时间(时间单位纳秒)。
  • 在正式测试之前,对所有的参赛者提交的试题进行试跑1次,在试跑完成后,正式执行赛题的性能测试,首先,对参赛者提交的试题10次,去掉两个最高分,去掉两个最低分,其余6次测试结果取平均值。
    裁判方运行验证程序判断输出结果与标准输出结果的偏差,如果输出结果存在偏差,即为0分。
  • 在输出结果完全正确的前提下,以执行时间作为二次裁决依据,时间越短,排名越高。
  • 为方便大家横向比较自己的性能情况。将执行的秒数定义为x,排行榜展示的得分。

解决方案

cf过虚拟化代码_数据挖掘_02

  • 优化策略:从线程分配、关系计算、数据处理三个方面来考虑

数据处理

  • 数据映射:对文本文件进行映射读写
  • 超前预处理:预估账号数量和关系数量

关系计算

  • (1) 初始化、关系计算、归一化;
  • (2) 初始化、经典并查集、示例;
    核心:通过递归进行深度并查;
    问题:关系越复杂,路径越深,从低部找到根结点会越来越难。
  • (3) 初始化、局部并查集、示例。
    特点:通过判断进行有限深度并查;
    优势:路径压缩,有限深度,局部并查。

线程分配

  • 特点:数据读写、关联关系计算耗时较长
  • 处理:分批次递增式多线程读取;依赖关系分析任务即时调用;分批次数据生成

最终方案2.0

  • 主线程:输出文件预处理、输出自负数组初始化、重复度计算、输出文件生成

2.0结果分析

cf过虚拟化代码_cf过虚拟化代码_03

优化方案3.0

cf过虚拟化代码_java_04

3.0结果分析

cf过虚拟化代码_ccf_05

总结与展望

cf过虚拟化代码_数据挖掘_06

END

  • 欢迎阅读,完整代码详见https://github.com/wang-zhq/RuiAn