[挑战][大数据处理]100G文本统计关键字、根据关键词频率对所有行重新排序

头像
523066680
Administrator
Administrator
帖子: 461
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 51 times
Been thanked: 90 times
联系:

[挑战][大数据处理]100G文本统计关键字、根据关键词频率对所有行重新排序

帖子 #1 523066680 » 2019年02月03日 09:01

源自ChinaUnix一个用户提出的问题,当时帮题主整理了一个具体的处理方案,但是上G的文件依然没有写出高效率的代码。
原帖1 http://bbs.chinaunix.net/thread-4263348-1-1.html

实际文本100G,内存仅4G以内。磁盘空间按1T算。

文本内容由大量明文字符串组成(ASCII码以内),部分样板:
65425855662efssaezsdfcsf//sff.sdf/'s;f]\sDed33dds3
65425855662efssaezsdfcsf/ /sff.sdf/'s;f] \sDed33sdds1
yjyjgwwwghfg56www g.tgjgcom445.5454.'55.4l5
efssaezsdfcsf//58969752sff.sdf/'s;f]\sDed33sds0
efssaezsdfcsf/ 58969752/sff.sdf/'s;f] \sDed33sdds5
65425855662efssaezsdfcsf/ /sff.sdf/'s;f] \sDed33s00000000
65425855662efs\saezsdf][grytryg*f-x+f5g5ty'5t;54r]\5/e.,6ftfr//www.fsfsf.com

处理结果:
65425855662efssaezsdfcsf/ /sff.sdf/'s;f] \sDed33sdds1
65425855662efssaezsdfcsf//sff.sdf/'s;f]\sDed33dds3
65425855662efssaezsdfcsf/ /sff.sdf/'s;f] \sDed33s00000000
efssaezsdfcsf/ 58969752/sff.sdf/'s;f] \sDed33sdds5
efssaezsdfcsf//58969752sff.sdf/'s;f]\sDed33sds0
65425855662efs\saezsdf][grytryg*f-x+f5g5ty'5t;54r]\5/e.,6ftfr//www.fsfsf.com
yjyjgwwwghfg56www g.tgjgcom445.5454.'55.4l5

处理要求:
提取出每行的 “数字串” 和 “字母串”,标点符号不计入内,统计这些 “关键字” 在全文中重复出现的频率/次数。
然后将含有高频率关键字的行排在前面,关键字出现频率低的行排在后面。
可以先按给出的样板进行处理,但是请考虑达到100G后内存的控制以及效率问题。


详细过程:
    每行的关键字提取,并统计其在全文中出现的次数统计(如果单行内出现多次,计为一次)
    f(6),efssaezsdfcsf(5),sff(5),s(5),sDed(5),33(5),sdf(5),65425855662(4),3(1),dds(1)
    f(6),s(5),sff(5),efssaezsdfcsf(5),33(5),sdf(5),sDed(5),65425855662(4),sdds(2),1(1)
    5(3),g(2),www(2),yjyjgwwwghfg(1),56(1),445(1),tgjgcom(1),4(1),l(1),5454(1),55(1)
    f(6),33(5),sdf(5),sDed(5),s(5),sff(5),efssaezsdfcsf(5),58969752(2),0(1),sds(1)
    f(6),efssaezsdfcsf(5),sff(5),s(5),sDed(5),33(5),sdf(5),5(3),sdds(2),58969752(2)
    f(6),efssaezsdfcsf(5),s(5),sff(5),sDed(5),sdf(5),33(5),65425855662(4),00000000(1)
    f(6),65425855662(4),5(3),g(2),www(2),x(1),ftfr(1),e(1),com(1),54(1),t(1),ty(1),fsfsf(1),grytryg(1),efs(1),r(1),6(1),saezsdf(1)

    按频率系数对每一行排序(从最高的频率开始对比;如果最高的次数相同,则对比第二列,以此类推)
    f(6),s(5),sff(5),efssaezsdfcsf(5),33(5),sdf(5),sDed(5),65425855662(4),sdds(2),1(1)
    f(6),efssaezsdfcsf(5),sff(5),s(5),sDed(5),33(5),sdf(5),65425855662(4),3(1),dds(1)
    f(6),efssaezsdfcsf(5),s(5),sff(5),sDed(5),sdf(5),33(5),65425855662(4),00000000(1)
    f(6),efssaezsdfcsf(5),sff(5),s(5),sDed(5),33(5),sdf(5),5(3),sdds(2),58969752(2)
    f(6),33(5),sdf(5),sDed(5),s(5),sff(5),efssaezsdfcsf(5),58969752(2),0(1),sds(1)
    f(6),65425855662(4),5(3),g(2),www(2),x(1),ftfr(1),e(1),com(1),54(1),t(1),ty(1),fsfsf(1),grytryg(1),efs(1),r(1),6(1),saezsdf(1)
    5(3),g(2),www(2),yjyjgwwwghfg(1),56(1),445(1),tgjgcom(1),4(1),l(1),5454(1),55(1)

    为了看得清楚一点,仅列出频率系数,前后对比:
    Before:
    [0]6,5,5,5,5,5,5,4,1,1
    [1]6,5,5,5,5,5,5,4,2,1
    [2]3,2,2,1,1,1,1,1,1,1,1
    [3]6,5,5,5,5,5,5,2,1,1
    [4]6,5,5,5,5,5,5,3,2,2
    [5]6,5,5,5,5,5,5,4,1
    [6]6,4,3,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1

    After
    [1]6,5,5,5,5,5,5,4,2,1
    [0]6,5,5,5,5,5,5,4,1,1
    [5]6,5,5,5,5,5,5,4,1
    [4]6,5,5,5,5,5,5,3,2,2
    [3]6,5,5,5,5,5,5,2,1,1
    [6]6,4,3,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1
    [2]3,2,2,1,1,1,1,1,1,1,1

注意上面的结果是同一“单词”在单行中重复多次记为一次的。应考虑按多次计算的情况(或者做个开关允许按不同方式处理)
65425855662efssaezsdfcsf/ /sff.sdf/'s;f] \sDed33s00000000
一行内两次算是2次吗?我以为一行内多次也计为1次,还特地做了判断

Windows19 回复 53# 523066680
如果算2次影响效率
那在一行内出现相同的算1次也可以

当然这个细节问题不大,主要还是:硬盘、内存、时间效率。
为了减少过度的测试时间和硬盘消耗,可将此问题稍作修改,改为10G文件(或1G),语言不限。

头像
523066680
Administrator
Administrator
帖子: 461
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 51 times
Been thanked: 90 times
联系:

补充 RE: [挑战]100G文本统计+排序

帖子 #2 523066680 » 2019年02月03日 09:03

这个问题有一个分支剧情,就是当时我建议题主去C++板块提问,windoze版主给他提出了解答此题6000元的报价
windoze 回复 3# Windows19

nonono,问题不是支付方式,而是金额。
你要的这个东西显然已经超出论坛技术讨论的范围,我拍脑袋的估一下差不多要一周左右的工作量,假设你找了一个月薪20000的人帮你做这件事,至少就得掏5000块,而且一般零活的价钱会在月结工资的基础上再向上浮动10~20%。

不知道lz有没有做好掏6000块的心理准备。


回到 “算法和编码”

在线用户

用户浏览此论坛: 没有注册用户 和 0 访客