提出问题
☆─────────────────────────────────────☆
1. 给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL。
2. 有10个文件,每个文件1G, 每个文件的每一行都存放的是用户的query,每个文件的query都可能重复。要你按照query的频度排序
3. 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16个字节,内存限制大小是1M。返回频数最高的100个词
大家讨论讨论这三道题的算法
--------------------------------------------------------------
各种回答讨论
lars (蓝天白云) 于 (Sat Sep 12 00:05:27 2009) 提到:
对于这类问题来说,I/O都比内存内处理时间更重要
1. Hash成内存大小的小块文件,然后分块内存内查交集.
2. 根据数据稀疏程度算法会有不同,通用方法是用Hash把文件重排,让相同query一定会在同一个文件,然后分别计数,排序,然后归并.
3. 跟2类似,只是不需要排序,各个文件分别统计前100,然后一起找前100。
【 在 realchaoren (超人) 的大作中提到: 】
: 标 题: 大规模数据查重
: 发信站: 水木社区 (Fri Sep 11 23:54:45 2009), 站内
:
: 1. 给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL。
:
: 2. 有10个文件,每个文件1G, 每个文件的每一行都存放的是用户的query,每个文件的query都可能重复。要你按照query的频度排序
:
: 3. 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16个字节,内存限制大小是1M。返回频数最高的100个词
:
: 大家讨论讨论这三道题的算法
: --
:
: ※ 来源:·水木社区 http://newsmth.net·[FROM: 159.226.43.*]
☆─────────────────────────────────────☆
koo (傻子) 于 (Sat Sep 12 00:09:05 2009) 提到:
第一个,50亿的数据刚好是4G,所以出题者应该是让你用内排吧?
两次内排,3次读入,一次写出。
【 在 realchaoren (超人) 的大作中提到: 】
: 1. 给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL。
: 2. 有10个文件,每个文件1G, 每个文件的每一行都存放的是用户的query,每个文件的query都可能重复。要你按照query的频度排序
: 3. 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16个字节,内存限制大小是1M。返回频数最高的100个词
: ...................
☆─────────────────────────────────────☆
realchaoren (超人) 于 (Sat Sep 12 00:16:12 2009) 提到:
对于第二题,怎么利用hash把文件进行重排?
是不是等同于第一题,对hash值进行分段。
【 在 lars (蓝天白云) 的大作中提到: 】
: 对于这类问题来说,I/O都比内存内处理时间更重要
: 1. Hash成内存大小的小块文件,然后分块内存内查交集.
: 2. 根据数据稀疏程度算法会有不同,通用方法是用Hash把文件重排,让相同query一定会在同一个文件,然后分别计数,排序,然后归并.
: ...................
☆─────────────────────────────────────☆
lars (蓝天白云) 于 (Sat Sep 12 00:20:32 2009) 提到:
10个1G的文件,假设内存2G,那就用一个大概N个桶, N稍大于5的hash函数,把数据分散到N个文件中,如果还有大于2G的文件继续hash分。
【 在 realchaoren (超人) 的大作中提到: 】
: 对于第二题,怎么利用hash把文件进行重排?
: 是不是等同于第一题,对hash值进行分段。
☆─────────────────────────────────────☆
SilentSpirit (Spirit ) 于 (Sat Sep 12 09:05:03 2009) 提到:
第三题最简单,用堆排序,不过不能用大顶堆,要用小定堆~
每次遇到比小顶堆的堆顶元素大的,就用该元素替换堆顶的元素,如此走完一遍即可。
【 在 realchaoren (超人) 的大作中提到: 】
: 1. 给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL。
: 2. 有10个文件,每个文件1G, 每个文件的每一行都存放的是用户的query,每个文件的query都可能重复。要你按照query的频度排序
:
: ...................
☆─────────────────────────────────────☆
SilentSpirit (Spirit ) 于 (Sat Sep 12 09:07:13 2009) 提到:
不对……看错题了……
【 在 SilentSpirit (Spirit ) 的大作中提到: 】
: 第三题最简单,用堆排序,不过不能用大顶堆,要用小定堆~
: 每次遇到比小顶堆的堆顶元素大的,就用该元素替换堆顶的元素,如此走完一遍即可。
☆─────────────────────────────────────☆
SilentSpirit (Spirit ) 于 (Sat Sep 12 09:12:15 2009) 提到:
我觉得是,因为目的是一样的~
【 在 realchaoren (超人) 的大作中提到: 】
: 对于第二题,怎么利用hash把文件进行重排?
: 是不是等同于第一题,对hash值进行分段。
☆─────────────────────────────────────☆
realchaoren (超人) 于 (Sat Sep 12 11:30:25 2009) 提到:
这样不对,每个词你还得统计词频
【 在 SilentSpirit (Spirit ) 的大作中提到: 】
: 我觉得是,因为目的是一样的~
☆─────────────────────────────────────☆
SilentSpirit (Spirit ) 于 (Sat Sep 12 12:35:37 2009) 提到:
对啊,按照第一题的方法进行划分之后,相同的query一定落在相同的块里,统计词频有什么问题?
【 在 realchaoren (超人) 的大作中提到: 】
: 这样不对,每个词你还得统计词频
☆─────────────────────────────────────☆
qblyy (每天爱你多一些) 于 (Sat Sep 12 12:36:42 2009) 提到:
对
【 在 loser (......) 的大作中提到: 】
: 第3个,各个文件统计前100再一起找前100不一定能把本来的前100找出来吧
☆─────────────────────────────────────☆
SilentSpirit (Spirit ) 于 (Sat Sep 12 12:37:01 2009) 提到:
哦,sorry,看错了,第二题的划分和第一题确实不一样,应该是比第一种要求严格~
【 在 SilentSpirit (Spirit ) 的大作中提到: 】
: 我觉得是,因为目的是一样的~
☆─────────────────────────────────────☆
SilentSpirit (Spirit ) 于 (Sat Sep 12 12:38:47 2009) 提到:
一定是的,因为划分的方式是把相同内容的一定hash到一个块里,或者一组块里,这样的话每个分组的统计就是完整的了。在单个分组里都不是top 100的话,在整体中当然就不可能是top 100了。
【 在 loser (......) 的大作中提到: 】
: 第3个,各个文件统计前100再一起找前100不一定能把本来的前100找出来吧
☆─────────────────────────────────────☆
giantchen (研究僧) 于 (Sat Sep 12 13:42:00 2009) 提到:
> 存放50亿条URL,每条URL占用64字节
64 * 50亿 = 320GB = 298 GiB
【 在 koo (傻子) 的大作中提到: 】
: 第一个,50亿的数据刚好是4G,所以出题者应该是让你用内排吧?
: 两次内排,3次读入,一次写出。
☆─────────────────────────────────────☆
koo (傻子) 于 (Sat Sep 12 13:44:56 2009) 提到:
嗯,我错了,看错了64bit
【 在 giantchen (研究僧) 的大作中提到: 】
: 64 * 50亿 = 320GB = 298 GiB
☆─────────────────────────────────────☆
wyb (wyb) 于 (Sat Sep 12 13:58:35 2009) 提到:
我不知道理解的对不对,对hash理解的不深刻,还请指教:)
1.hash成内存大小的小块文件是否分别对a,b两个大文件进行,比如说根据hash code分
段成N段,是否意味着对a划分成N个小文件,对b也划分成N个小文件,然后对这2N个小文
件进行内存内查交集?
2.第二个问题相对于第一个问题的区别是否是第二个问题文件在重排的过程中,对于qu
ery不是简单的判断有无,而是要把重复的query全部以追加的方式记录下来?那为什么
不能在hash的过程中就进行计数,而要在之后处理呢?
谢谢先!
【 在 lars (蓝天白云) 的大作中提到: 】
: 对于这类问题来说,I/O都比内存内处理时间更重要
: 1. Hash成内存大小的小块文件,然后分块内存内查交集.
: 2. 根据数据稀疏程度算法会有不同,通用方法是用Hash把文件重排,让相同query一定会在同一个文件,然后分别计数,排序,然后归并.
: ...................
☆─────────────────────────────────────☆
chenyukun (chenyukuno3) 于 (Sat Sep 12 14:02:27 2009) 提到:
bitmap,一个5G的文件,考虑到会重复,可以哈希到4G的bitmap中去。扫描另一个文件,hash,去bitmap中查。
【 在 koo (傻子) 的大作中提到: 】
: 嗯,我错了,看错了64bit
☆─────────────────────────────────────☆
wyb (wyb) 于 (Sat Sep 12 14:05:54 2009) 提到:
不是很明白,已经占用了4G的bitmap内存,怎么再去打开一个文件呢?
【 在 chenyukun (chenyukuno3) 的大作中提到: 】
: bitmap,一个5G的文件,考虑到会重复,可以哈希到4G的bitmap中去。扫描另一个文件,hash,去bitmap中查。
☆─────────────────────────────────────☆
koo (傻子) 于 (Sat Sep 12 14:06:49 2009) 提到:
bitmap不就是hash嘛,二楼就说了这个方法
思想是用hash把问题规模缩小,分而治之
【 在 chenyukun (chenyukuno3) 的大作中提到: 】
: bitmap,一个5G的文件,考虑到会重复,可以哈希到4G的bitmap中去。扫描另一个文件,hash,去bitmap中查。
☆─────────────────────────────────────☆
karnon (karnon) 于 (Sat Sep 12 14:53:17 2009) 提到:
我觉得这类的问题,先排序不是挺好的吗?
【 在 chenyukun (chenyukuno3) 的大作中提到: 】
: bitmap,一个5G的文件,考虑到会重复,可以哈希到4G的bitmap中去。扫描另一个文件,hash,去bitmap中查。
☆─────────────────────────────────────☆
TRAD (GFans) 于 (Sat Sep 12 15:02:58 2009) 提到:
:1. 给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找
出:A,B文件共同的URL。
bloom filter
:2. 有10个文件,每个文件1G, 每个文件的每一行都存放的是用户的query,每个文件
的:query都可能重复。要你按照query的频度排序
map reduce 几分钟可以在hadoop集群上搞定
:3. 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16个字节,内存限
:制大小是1M。返回频数最高的100个词
这种问题是吃饱了撑的吗?非要限制1M内存。
☆─────────────────────────────────────☆
koo (傻子) 于 (Sat Sep 12 15:23:29 2009) 提到:
我还有个更好的办法
中国13亿人,每个人分到4条记录,每个人戴个耳机,你大喊一声,某某记录举手,哗的一下,全举起来了,你点点手,记下一个数字,接着统计下一条数据。
不用内存
【 在 TRAD (GFans) 的大作中提到: 】
: 标 题: Re: 大规模数据查重
: 发信站: 水木社区 (Sat Sep 12 15:02:58 2009), 站内
:
:
: :1. 给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找
: 出:A,B文件共同的URL。
:
: bloom filter
:
: :2. 有10个文件,每个文件1G, 每个文件的每一行都存放的是用户的query,每个文件
: 的:query都可能重复。要你按照query的频度排序
:
: map reduce 几分钟可以在hadoop集群上搞定
:
: :3. 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16个字节,内存限
: :制大小是1M。返回频数最高的100个词
: 这种问题是吃饱了撑的吗?非要限制1M内存。
: --
:
: ※ 来源:·水木社区 http://newsmth.net·[FROM: 115.170.214.*]
☆─────────────────────────────────────☆
karnon (karnon) 于 (Sat Sep 12 15:38:24 2009) 提到:
13亿个耳机。。。够买无数内存了。。。。
【 在 koo (傻子) 的大作中提到: 】
: 我还有个更好的办法
: 中国13亿人,每个人分到4条记录,每个人戴个耳机,你大喊一声,某某记录举手,哗的一下,全举起来了,你点点手,记下一个数字,接着统计下一条数据。
: 不用内存
: ...................
☆─────────────────────────────────────☆
koo (傻子) 于 (Sat Sep 12 15:45:35 2009) 提到:
【 在 karnon (karnon) 的大作中提到: 】
: 13亿个耳机。。。够买无数内存了。。。。
☆─────────────────────────────────────☆
luoxinping (寻IR大坑淹死自己中) 于 (Sat Sep 12 16:11:14 2009) 提到:
难道bloomfilter用不上?
【 在 realchaoren (超人) 的大作中提到: 】
: 1. 给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL。
: 2. 有10个文件,每个文件1G, 每个文件的每一行都存放的是用户的query,每个文件的query都可能重复。要你按照query的频度排序
: 3. 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16个字节,内存限制大小是1M。返回频数最高的100个词
: ...................
☆─────────────────────────────────────☆
chenyukun (chenyukuno3) 于 (Sat Sep 12 17:22:30 2009) 提到:
他说的是多块,其实一次hash就可以了
【 在 koo (傻子) 的大作中提到: 】
: bitmap不就是hash嘛,二楼就说了这个方法
: 思想是用hash把问题规模缩小,分而治之
☆─────────────────────────────────────☆
chenyukun (chenyukuno3) 于 (Sat Sep 12 17:22:55 2009) 提到:
要能不排序就解决问题,那更好
【 在 karnon (karnon) 的大作中提到: 】
: 我觉得这类的问题,先排序不是挺好的吗?
☆─────────────────────────────────────☆
chenyukun (chenyukuno3) 于 (Sat Sep 12 17:24:55 2009) 提到:
bloomfilter是要2*n的大小吧?
【 在 luoxinping (寻IR大坑淹死自己中) 的大作中提到: 】
: 难道bloomfilter用不上?
☆─────────────────────────────────────☆
wyb (wyb) 于 (Sat Sep 12 19:24:55 2009) 提到:
呃,是不是我的问题很弱智啊?
【 在 wyb (wyb) 的大作中提到: 】
: 我不知道理解的对不对,对hash理解的不深刻,还请指教:)
: 1.hash成内存大小的小块文件是否分别对a,b两个大文件进行,比如说根据hash code分
: 段成N段,是否意味着对a划分成N个小文件,对b也划分成N个小文件,然后对这2N个小文
: ...................
☆─────────────────────────────────────☆
Binknight (Collin) 于 (Sat Sep 12 20:49:51 2009) 提到:
百度面试题吧。。
A,B两个题被问过
【 在 realchaoren (超人) 的大作中提到: 】
: 1. 给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你
找出A,B文件共同的URL。
: 2. 有10个文件,每个文件1G, 每个文件的每一行都存放的是用户的query,每个文件
的query都可能重复。要你按照query的频度排序
:
: ...................
☆─────────────────────────────────────☆
smthaccount (waitlove) 于 (Sat Sep 12 21:53:55 2009) 提到:
呵呵
【 在 TRAD (GFans) 的大作中提到: 】
: :1. 给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找
: 出:A,B文件共同的URL。
: bloom filter
: ...................
☆─────────────────────────────────────☆
SilentSpirit (Spirit ) 于 (Sat Sep 12 22:47:44 2009) 提到:
排序肯定能解决问题,但不一定是最优的方法。
排序只是去重的一个方法~
【 在 karnon (karnon) 的大作中提到: 】
: 我觉得这类的问题,先排序不是挺好的吗?
☆─────────────────────────────────────☆
PeterCDMA (http://blog.163.com/petercdma@126) 于 (Sun Sep 13 00:40:24 2009) 提到:
同问
【 在 realchaoren (超人) 的大作中提到: 】
: 1. 给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找
出A,B文件共同的URL。
: 2. 有10个文件,每个文件1G, 每个文件的每一行都存放的是用户的query,每个文件的
query都可能重复。要你按照query的频度排序
:
: ...................
☆─────────────────────────────────────☆
TheChild (慢步者) 于 (Sun Sep 13 12:29:06 2009) 提到:
第 1 题选什么哈希算法好?要用多少个哈希算法?
4G 内存,就是 32G bit,把 64 字节的内容哈希到 32G 的空间,执行 50G 次,最终合并
的效果要达到 bloom filter 较好的效果,哈希算法的选择是很重要的。
【 在 TRAD (GFans) 的大作中提到: 】
: :1. 给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找
: 出:A,B文件共同的URL。
: bloom filter
: ...................
☆─────────────────────────────────────☆
mrchen (MR.Chen) 于 (Sun Sep 13 23:56:04 2009) 提到:
为嘛要排序?多累呀
【 在 lars (蓝天白云) 的大作中提到: 】
: 对于这类问题来说,I/O都比内存内处理时间更重要
: 1. Hash成内存大小的小块文件,然后分块内存内查交集.
: 2. 根据数据稀疏程度算法会有不同,通用方法是用Hash把文件重排,让相同query一定会在同一个文件,然后分别计数,排序,然后归并.
: ...................
☆─────────────────────────────────────☆
SilentSpirit (Spirit ) 于 (Mon Sep 14 09:59:14 2009) 提到:
因为题目要求排序……
【 在 mrchen (MR.Chen) 的大作中提到: 】
: 为嘛要排序?多累呀
☆─────────────────────────────────────☆
luoxinping (寻IR大坑淹死自己中) 于 (Wed Sep 16 10:01:04 2009) 提到:
此n不是50亿的意思?
2*50*10^8/8(用位表示)字节
【 在 chenyukun (chenyukuno3) 的大作中提到: 】
: bloomfilter是要2*n的大小吧?
☆─────────────────────────────────────☆
Nineteen (...) 于 (Thu Oct 15 22:05:12 2009) 提到:
先排序,然后算
【 在 realchaoren (超人) 的大作中提到: 】
: 1. 给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL。
: 2. 有10个文件,每个文件1G, 每个文件的每一行都存放的是用户的query,每个文件的query都可能重复。要你按照query的频度排序
: 3. 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16个字节,内存限制大小是1M。返回频数最高的100个词
: ...................