您好,刚向领导提问的最佳问题去重问题,我操作了还是不行

在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
主要是对行去重
如果先排序的话。。大约是这样:
sort bigtext.txt|uniq
因为uniq只能去相邻行的重,但是对大文本进行排序这个代价有点大?O(n log n)对于n达到上亿好像太慢了?
其他的使用set更加。。。如果重复率小,吃内存吃的不行。。。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
P.S. 哈希表实现对内存有要求,基本上1000w去重后的数据对应1G内存的样子。我都用64G的机器搞,所以还好。。如果再大,上hadoop吧。
如果只是去重,用sort的效率很低(指的是上千万行的量级),因为做了额外操作,因为你只是要去重,而不是排序
用awk数组来实现很简单很快,利用了awk数组是hashtable实现的特性。内存占用和去重后(注意是去重后)的行数(注意是行数,而不是你的文本内容)成正比。
cat 一堆文件 | awk '{ if (!seen[$0]++) { print $0; } }'
来个实际的测试结果吧,取100w 不重复的URL,简单复制一份,形成一个200w行的文件(请原谅我不能拿几亿的数量做测试,因为sort实在太慢了,上面说可以接受的肯定是没有测试过。。)
$ wc -l 200w
$ tail -1 200w
$ time cat 200w | sort | uniq
& sort_uniq
0.01s user 0.08s system 0% cpu 21.844 total
35.13s user 0.24s system 76% cpu 46.279 total
uniq & sort_uniq
21.43s user 0.17s system 46% cpu 46.278 total
sort && uniq 耗时 46s,并且会打满一个CPU核
$ time cat 200w | sort -u
0.01s user 0.08s system 0% cpu 24.806 total
sort -u & sort_u
47.56s user 0.31s system 99% cpu 48.002 total
** sort -u 耗时48s,差不多吧 **
$ time cat 200w | awk '{ if (!seen[$0]++) { print $0; } }' & awk
0.01s user 0.08s system 3% cpu 3.144 total
awk '{ if (!seen[$0]++) { print $0; } }' & awk
2.83s user 0.23s system 96% cpu 3.158 total
awk 方法耗时3s , 而且最重要的awk方法的时间复杂度是O(n), sort是O(nlogn),200w就差这么大,2000w呢,2亿么,可想而知
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
但是对大文本进行排序这个代价有点大?O(n log n)对于n达到上亿好像太慢了?
代价不大。排序的话是省内存的。(sort的算法实现应该是比较高效的。)
要不就是对每行算SHA-1,这样只要比较SHA-1就可以。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
有时候超大文本你的内存受不了,所以比较好的方法是找几个分割点,把所有数据分成N堆,各自排序后组合。(貌似得编码……)
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
如果可以忍受误差(就是有一定的误判),bloom filter是个不错的办法。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
我提供一个思路供您参考。
扫一遍文件,对每一行计算一个MD5或者SHA-1值,在内存构建trie树。鉴于数据量很大,生成的MD5值应该存在许多前缀,所以采用trie可以节省空间(如果想进一步节省空间,可以采用三向单词查找树,比trie分支更少),而且trie树的深度不会超过MD5值的长度,几十而已,每次查找或者插入MD5值都是个时间复杂度为常数的操作。向trie添加某个MD5值时如果发现该值已经存在,则抛弃目前扫描的行;如果不存在,则把MD5值插入trie树,把当前扫描行写入结果文件(这个文件保存所有不重复的行)。
这样,扫描一遍文件就能实现去重。
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。您好!我老公昨天在重庆被抓了,但是我现在在广州我可以不过去重 - 110网免费法律咨询
您的位置:
&& 查看咨询        今日活跃律师: &&&&&&&&&&
该问题已关闭
的回复获得奖章一枚
的回复获得奖章一枚
的回复获得奖章一枚
的回复获得奖章一枚
的回复获得奖章一枚
的回复获得奖章一枚
的回复获得奖章一枚
的回复获得奖章一枚
的回复获得奖章一枚
的回复获得奖章一枚
您好!我老公昨天在重庆被抓了,但是我现在在广州我可以不过去重
重庆-巴南&05-31 19:26&&悬赏 0&&发布者:ask201…… & 回答:(4)
您好!我老公昨天在重庆被抓了,但是我现在在广州我可以不过去重庆可以打电话请你那边的律师吗
您也有法律问题? 您可以 发布咨询,我们的律师随时在线为您服务
[重庆-沙坪坝]
回复时间:
可以委托律师辩护,有疑问可来电
[重庆-云阳]
回复时间:
可以委托重庆律师为你老公提供法律服务。
[重庆-渝北]
回复时间:
可以委托律师会见
[重庆-渝中]
103040积分
回复时间:
您好!可以通过邮寄方式委托律师。
问题答案可能在这里 →
无锡推荐律师
最佳律师解答
(高宏图)()&
(郎海华)()&
(毕丽荣)()&
(毕丽荣)()&
最新回复律师
人气:967433
人气:506550
人气:85463
人气:20391
北京 海淀区
人气:883226
人气:347528您好我是刚才提问单片机的那个人_百度知道
您好我是刚才提问单片机的那个人
要求就是刚才那个问题里面的要求,基本上就是一套餐厅叫餐系统,我只是个刚学了半学期的小白,只会做流水灯和时钟之类的,这周单片机实训老师突然让做这个!完全没有头绪,瞎折腾了两天什么都没做出来,然后百度了一下发现这个基本上是毕设级别的了...实在没有...
我有更好的答案
这个可能真没人做过,而且难度还是有点大,你也说了是毕设级别的,要花费很多时间,所以没人愿意为挣带你财富值来费心费力的。
来自:求助得到的回答
为您推荐:
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。您好,您上次的在“百度知道”提问的这个问题解决了吗,我现在也遇到同样的问题。没法解决。。。_百度知道
您好,您上次的在“百度知道”提问的这个问题解决了吗,我现在也遇到同样的问题。没法解决。。。
下载下来的视频用播放器全部没声音。用了百度影音,快播,正常播放,有图没声音。用暴风影音打开一个视频,播放2秒然后停止。PPTV点击视频,一直没图出来,读取进度0%,网页也现实0网页上的都可以看,优酷,土豆,56都播放正常,有图有声音。昨天一切正常,晚...
我有更好的答案
你上面没有说 用百度影音,快播,正常播放,有图没声音 里面的视频是本地的还是用播放器看的 要是本地的可能是格式或解码器不兼容不支持 这个就需要换一个播放器支持这个视频格式的
要是在播放器直接打开的话 可能是播放器 问题
你可以把你有问题的播放器都卸载 在重新下载最新版本安装
你的电脑 既让是 优酷,土豆,56都播放正常,有图有声音 基本排除了 电脑硬件和软件驱动的可能
还是播放器有问题的面大一些 你先试试看看
为您推荐:
其他类似问题
百度知道的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。Excel里一个单元格的数据去重问题。_百度知道
Excel里一个单元格的数据去重问题。
单元格的数据如下:1;2;3;4;5;5;4;3;2;1.要求变成1;2;3;4;5。分号去重问题。
我有更好的答案
'运行以下代码,效果如图。Sub&test()Application.DisplayAlerts&=&FalseOn&Error&GoTo&endlineSet&d&=&CreateObject(&scripting.dictionary&)Set&X&=&Application.InputBox(&&,&&选择单元格&,&,&,&,&,&,&8)If&X.Count&&&1&Then&MsgBox&&只能选择单个单元格!&:&GoTo&endlineIf&Len(X)&=&0&Then&MsgBox&&所选为空值!&:&GoTo&endlineSet&y&=&Application.InputBox(&&,&&选择放置结果的区域&,&,&,&,&,&,&8)arr&=&VBA.Split(X,&&;&)For&Each&Rng&In&arr&&&&d(Rng)&=&&&NextRange(y.Address)(1).Range(&a1&)&=&VBA.Join(d.keys,&&;&)d.RemoveAllendline:Application.DisplayAlerts&=&TrueEnd&Sub
粘贴上去了还是不行,…能帮忙弄一下吗。很急…
采纳率:39%
来自团队:
Sub 去重复后再放入一个单元格并用分号隔开()Dim i$arr = Split([A1].Value, &;&)'[a2].Resize(1, UBound(arr)) = arrSet d = CreateObject(&scripting.dictionary&)For Each arr1 In arrIf Not d.exists(arr1) Then d.Add arr1, NothingNext'[a2].Resize(1, d.Count) = d.keys '去重复后,横排'[a3].Resize(d.Count, 1) = Application.Transpose(d.keys) '去重复后,竖排m = d.keysFor Each arr2 In mj = j + 1rn = rn & m(j - 1) & &;&Next[A3] = Left(rn, Len(rn) - 1)End Sub
还是不会使用…
能帮我整理一下吗?数据也不多,就是复杂,我要是一个个弄估计很费时间了。…今天要交…
为您推荐:
其他类似问题
您可能关注的内容
excel的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 采访人物提问问题大全 的文章

 

随机推荐