1 / 10
文档名称:

c语言如何对海量数据进行处理.doc.txt

格式:txt   页数:10
下载后只包含 1 个 TXT 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

c语言如何对海量数据进行处理.doc.txt

上传人:rjmy2261 2012/10/22 文件大小:0 KB

下载得到文件列表

c语言如何对海量数据进行处理.doc.txt

文档介绍

文档介绍:c语言如何对海量数据进行处理
海量数据处理专题
给定 a、b 两个文件,各存放 50 亿个 url,每个 url 各占 64 字节,内存限制是 4G,让你找出 a、b 文件共同的 url?
方案 1:可以估计每个文件的大小为 50G×64=320G,远远大于内存限制的 4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。 s 遍历文件 a,对每个 url 求取 1000 个小文件(记为,然后根据所取得的值将 url 分别存储到)中。这样每个小文件的大约为 300M。) 。)中,
s 遍历文件 b, 采取和 a 相同的方式将 url 分别存储到 1000 各小文件(记为这样处理后,所有可能相同的 url 都在对应的小文件(
不对应的小文件不可能有相同的 url。然后我们只要求出 1000 对小文件中相同的 url 即可。 s 求每对小文件中相同的 url 时,可以把其中一个小文件的 url 存储到 hash_set 中。然后遍历另一个小文件的每个 url,看其是否在刚才构建的 hash_set 中,如果是,那么就是共同的 url,存到文件里面就可以了。方案 2:如果允许有一定的错误率,可以使用 Bloom filter,4G 内存大概可以表示 340 亿 bit。将其中一个文件中的 url 使用 Bloom filter 映射为这 340 亿 bit,然后挨个读取另外一个文件的 url,检查是否与 Bloom filter,如果是,那么该 url 应该是共同的 url(注意会有一定的错误率)。
ps:个人认为方案 1 中的估计是不是有问题 50 亿就是 5*10 的 9 次方。小于等于 5*2 的 30 次方,即 5G,
有 10 个文件,每个文件 1G,每个文件的每一行存放的都是用户的 query,每个文件的 query 都可能重复。要求你按照 query 的频度排序。方案 1: s 顺序读取 10 个文件, 按照 hash(query)%10 的结果将 query 写入到另外 10 个文件(记为)中。这样新生成的文件每个的大小大约也 1G(假设 hash 函数是随机的)。用 hash_map(query, query_count)
s 找一台内存在 2G 左右的机器, 依次对
来统计每个 query 出现的次数。利用快速/堆/归并排序按照出现次数进行排序。将排序好的 query 和对应的 query_cout 输出到文件中。这样得到了 10 个排好序的文件(记为)。 s 对方案 2: 这 10 个文件进行归并排序(内排序与外排序相结合)。
一般 query 的总量是有限的,只是重复的次数比较多而已,可能对于所有的 query,一次性就可以加入到内存了。这样,我们就可以采用 trie 树/hash_map 等直接来统计每个 query 出现的次数,然后按出现次数做快速/堆/归并排序就可以了。方案 3: 与方案 1 类似,但在做完 hash,分成多个文件后,可以交给多个文件来处理,采用分布式的架构来处理(比如 MapReduce),最后再进行合并。(与 1 相比就是处理构架不同) 3. 有一个 1G 大小的一个文件,里面每一行是一个词,词的大小不超过 16 字节,内存限制大小是 1M。返回频数最高的 100 个词。方案