一道海量日志的随机选取问题

原创 2012年03月22日 10:39:48

原题是这样的:

假设有100G的日志存在于磁盘之上,其中每条日志占用的空间不多于100个字节,现在从日志随机选取N条日志,保证每条日志的选取概率相同。

解1:

最简单且严格的做法是扫描日志两遍。

第一遍:统计出日志的总条数,M。

第二遍:扫描每条日志以N/M的概率选择该条日志,直到满足N条日志。


解法2:

由于每条日志的最大长度为100字节,因此日志数量至少有K = 1G条,因此可以在扫描日志的时候进行随机抽样,使用一个较大的概率比如 10 * N / K。 这样选择出的日志条数肯定会大于N,并且总量远小于100G。 接下来可以按第一种方法从样本中随机选择出N条日志。


PS: 解法1和2都比较简单,但是会存在一个非常严重的问题,都需要读取所有的日志,100G的数据在读取时会非常耗时,最理想情况下以厂商的标准最快可以达到80M/s,这样读取100G的数据同样需要1250s,即20多分钟。那有没有一种方法减少读取磁盘的数据量?


解法3:假设文件的总大小为S=100G,在逻辑上将文本分成B=100W块,则每个块的实际大小为K=S/B, 然后在逻辑上遍历这100W个块,给每个块1/1000的选择概率。这样按偏移量从中选取1000个块,在这1000个块中随机抽取N条日志。这样实际读取的数据量大小为100M, 这已经非常小。

注:第三种方法可以会在每个日志的选取概率上出现细微的区别,但是由于数据量巨大,故这种差别可以忽略。


从1楼的评论中学习到一个算法 -- 蓄水池抽样,原理如下:

定义取出的行号为choice,第一次直接以第一行作为取出行 choice ,而后第二次以二分之一概率决定是否用第二行替换 choice ,第三次以三分之一的概率决定是否以第三行替换 choice ……,以此类推,可用伪代码描述如下: 
    i = 0 
    while more input lines 
               with probability 1.0/++i 
                       choice = this input line 
    print choice 
  这种方法的巧妙之处在于成功的构造出了一种方式使得最后可以证明对每一行的取出概率都为1/n(其中n为当前扫描到的文件行数),换句话说对每一行取出的概率均相等,也即完成了随机的选取。 
  回顾这个问题,我们可以对其进行扩展,即如何从未知或者很大样本空间随机地取k个数? 
  类比下即可得到答案,即先把前k个数放入蓄水池,对第k+1,我们以k/(k+1)概率决定是否要把它换入蓄水池,换入时随机的选取一个作为替换项,这样一直做下去,对于任意的样本空间n,对每个数的选取概率都为k/n。也就是说对每个数选取概率相等。 
  伪代码: 
    Init : a reservoir with the size: k 
    for i= k+1 to N 
        M=random(1, i); 
        if( M < k) 
        SWAP the Mth value and ith value 
    end for 

海量日志存储和查询方法及系统

摘要 本发明提供一种海量日志存储和查询方法及系统,其中的方法包括将分片后的日志按照主从关系存储为文件结构,其中,分片后的日志按照主从关系存储在主文件和从文件内,主文件包括日志的聚合数量、分片开始...
  • baidu_24932821
  • baidu_24932821
  • 2016年01月23日 10:58
  • 3305

海量数据常见的面试题(频次最高+随机抽样)

【在海量数据中统计出现次数最多的n个】  分两种情况,   1 如果数据能够在内存中放下,比如如果海量数据是ip地址,最多有4G个ip地址,每个ip地址占4个字节 需要内存16G,如果内存在几十G...
  • zkangaroo
  • zkangaroo
  • 2017年03月12日 16:35
  • 465

面试问题待解答

一、面试遇到的问题 1.百度 百度最近真是炙手可热,贴吧事件刚结束,医疗竞价排名又闹得沸沸扬扬,一些论坛上连带程序员都开始招黑了,友谊的小船可是说翻就翻。 说回面试,百度面了两次,分别是百度糯米...
  • yantao_3
  • yantao_3
  • 2017年06月28日 21:42
  • 310

海量数据等概率选取问题

1、问题定义可以简化如下:在不知道文件总行数的情况下,如何从文件中随机的抽取一行,并且每行被抽中的概率相等? 首先想到的是我们做过类似的题目吗?当然,在知道文件行数的情况下,我们可以很容易的用C...
  • wusecaiyun
  • wusecaiyun
  • 2015年10月24日 15:54
  • 154

海量数据等概率选取问题

1、问题定义可以简化如下:在不知道文件总行数的情况下,如何从文件中随机的抽取一行,并且每行被抽中的概率相等? 首先想到的是我们做过类似的题目吗?当然,在知道文件行数的情况下,我们可以很容易的用C...
  • xjc200808
  • xjc200808
  • 2015年09月17日 17:33
  • 202

Hadoop 提取KPI 进行海量Web日志分析

Hadoop 提取KPI 进行海量Web日志分析Web日志包含着网站最重要的信息,通过日志分析,我们可以知道网站的访问量,哪个网页访问人数最多,哪个网页最有价值等。一般中型的网站(10W的PV以上),...
  • lzxyzq
  • lzxyzq
  • 2016年05月12日 23:59
  • 9950

分布式海量日志采集、聚合和传输系统:Cloudera Flume

导读:本文介绍了分布式海量日志采集、聚合和传输系统Cloudera Flume相关内容,Flume是Cloudera提供的日志收集系统,Flume支持在日志系统中定制各类数据发送方。 关键词:Flu...
  • cnbird2008
  • cnbird2008
  • 2013年03月20日 11:49
  • 1863

排序算法(七)海量数据的排序问题

前边几篇文章,整理过各种各样的排序,但是那些排序都是只能在内存中进行排序,而如果给大量的数据(内存中无法容纳),要给这些数据进行排序,我们就需要借助于一种外排序----归并排序(之后的文章详细介绍)。...
  • peiyao456
  • peiyao456
  • 2016年11月27日 22:19
  • 847

面试必须掌握的十个海量数据问题及解决方案

原文链接:BAT直通车-海量数据专题更多精彩内容(BAT招聘、笔试、面试、技术),请访问BAT直通车题目问题一:现有海量日志数据,要提取出某日访问百度次数最多的那个IP(可以将题干简化,假设日志中仅包...
  • hitxueliang
  • hitxueliang
  • 2016年08月08日 16:57
  • 1975

随机选取算法 (有权重的记录中选取)

三类随机问题 1.  已有n条记录,从中选取m条记录,选取出来的记录前后顺序不管。      实现思路:按行遍历所有记录,约隔n/m条取一个数据即可 2.  在1...
  • zongquanliu
  • zongquanliu
  • 2015年05月20日 01:23
  • 1017
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一道海量日志的随机选取问题
举报原因:
原因补充:

(最多只允许输入30个字)