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

原创 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 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

单次遍历,带权随机选取问题(一)

在单次遍历,等概率随机选取问题中已经剧透了今天的内容,那就是带权随机选取(Weighted Random Sample)问题。 问题描述:有一组数量未知的数据,每个元素有非负权重。要求只遍历...

单次遍历,等概率随机选取问题

又是一道概率问题,不过跟之前的题目一样,这也是一道非常简单的题目。 问题描述:假设我们有一堆数据(可能在一个链表里,也可能在文件里),数量未知。要求只遍历一次这些数据,随机选取其中的一个元素,任...

根据权重随机选取指定条数记录的简单算法实现(C#)【含源代码】

原文地址: http://www.cnblogs.com/foolin/archive/2012/03/22/2412632.html 一.应用场景:     有时我们需要从一些列数据...

Java中从m个数中随机选取n个不同的数(m>=n),并进行排序

我这里直接给出我写的函数,

如何随机选取1000个关键字

给定一个数据流,其中包含无穷尽的搜索关键字(比如,人们在谷歌搜索时不断输入的关键字)。如何才能从这个无穷尽的流中随机的选取1000个关键字? 解决方案就是蓄水库抽样(reservoid samp...

关联函数返回多个数据时两种方法实现随机选取

最近带工程师做项目时,发现当关联函数返回多个数据时,不能很好的实现随机选取服务器返回的数据   今天就总结一下 :   方法一: 优点:lr任何版本都能使用,   缺点:需要写的函数比较...

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

三类随机问题 1.  已有n条记录,从中选取m条记录,选取出来的记录前后顺序不管。      实现思路:按行遍历所有记录,约隔n/m条取一个数据即可 2.  在1...
  • ybhjx
  • ybhjx
  • 2016-01-08 17:21
  • 222
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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