在R中对大数据进行引导采样(太大,无法装入RAM)

在R中对大数据进行引导采样(太大,无法装入RAM),r,bigdata,sampling,R,Bigdata,Sampling,是否可以从.Rdata对象或存储在磁盘上的任何其他大型数据对象中提取引导样本?我目前从非常大的数据中采样的方法是构建一个本地MySQL数据库,然后使用SQL将随机样本抽取到R中。不幸的是,MySQL中的采样和排序根本没有效率。我想知道是否有人为这个用例设计了更好的解决方案 要了解我当前的解决方案,请参阅以下关于MySQL中采样的问题: 一般说明 您不必将所有数据加载到sample,只需加载行的id,并从id中进行采样。然后仅加载采样行的数据。更详细地说: 例如,如果数据库中有一个名为ID的列,则

是否可以从.Rdata对象或存储在磁盘上的任何其他大型数据对象中提取引导样本?我目前从非常大的数据中采样的方法是构建一个本地MySQL数据库,然后使用SQL将随机样本抽取到R中。不幸的是,MySQL中的采样和排序根本没有效率。我想知道是否有人为这个用例设计了更好的解决方案

要了解我当前的解决方案,请参阅以下关于MySQL中采样的问题:

一般说明 您不必将所有数据加载到sample,只需加载行的id,并从id中进行采样。然后仅加载采样行的数据。更详细地说:

  • 例如,如果数据库中有一个名为
    ID
    的列,则只加载该列。这应该很快,特别是当
    ID
    是一个整数时。即使您有(比如)20亿条记录,也只需要8GB内存来存储20亿个整数,所以这应该是可能的

  • 然后从这些ID中提取样本

  • 然后仅加载带有采样ID的记录

  • 想想看。如果你想从网上书店Siren购买三本随机书籍,你会怎么做?塞壬有上百万本书,你不能订购所有的书,然后从中随机选择,然后把剩下的寄回去,对吗?所以你要做的是,你向Siren索要一份图书ID列表(ISBN就可以了),这个大小适合一台普通电脑。您可以从列表中随机选择三个,然后从Siren中对这三个进行排序

    Rdata文件 这显然不适用于.Rdata文件,但无论如何,.Rdata文件是没有希望的,因为您无法加载.Rdata文件的一部分。所以你需要一些被索引的格式

    sqlite 但是您可以使用sqlite和
    RSQLite
    RSQLite
    支持与数据帧绑定,因此要加载采样数据,只需将采样的id放入名为
    samp_id
    (单列名为
    id
    )的数据帧中,然后说

    ...
    my_samp <- dbGetQuery(con, "SELECT * FROM mytable WHERE id = :id", 
                          bind.data = samp_ids)
    ...
    
    然后,您可以编写SELECT以加入临时表
    tmp
    和原始数据表。

    概述 您不必将所有数据加载到sample,只需加载行的id,并从id中进行采样。然后仅加载采样行的数据。更详细地说:

  • 例如,如果数据库中有一个名为
    ID
    的列,则只加载该列。这应该很快,特别是当
    ID
    是一个整数时。即使您有(比如)20亿条记录,也只需要8GB内存来存储20亿个整数,所以这应该是可能的

  • 然后从这些ID中提取样本

  • 然后仅加载带有采样ID的记录

  • 想想看。如果你想从网上书店Siren购买三本随机书籍,你会怎么做?塞壬有上百万本书,你不能订购所有的书,然后从中随机选择,然后把剩下的寄回去,对吗?所以你要做的是,你向Siren索要一份图书ID列表(ISBN就可以了),这个大小适合一台普通电脑。您可以从列表中随机选择三个,然后从Siren中对这三个进行排序

    Rdata文件 这显然不适用于.Rdata文件,但无论如何,.Rdata文件是没有希望的,因为您无法加载.Rdata文件的一部分。所以你需要一些被索引的格式

    sqlite 但是您可以使用sqlite和
    RSQLite
    RSQLite
    支持与数据帧绑定,因此要加载采样数据,只需将采样的id放入名为
    samp_id
    (单列名为
    id
    )的数据帧中,然后说

    ...
    my_samp <- dbGetQuery(con, "SELECT * FROM mytable WHERE id = :id", 
                          bind.data = samp_ids)
    ...
    

    然后,您可以编写SELECT以加入临时表
    tmp
    和原始数据表。

    您可以使用ff包,使用基于文件的对象并从中采样。同样,bigmemory包也允许文件备份对象。您可以使用ff包,使用基于文件的对象,并从中获取示例。通过bigmemory软件包也是如此,该软件包也允许文件备份对象。这感觉像是一个注释。是否要详细说明如何使用行ID对未存储在内存中的对象进行采样?仅加载行ID。例如,如果是SQL表,则SQL行ID。如果对象没有行ID,那么将ID分配给行。完全没有,只需提供一个示例说明您的意思。我认为@thelatemail也很感兴趣。@Brandon Bertelsen:更好?这感觉像是一个评论。您想进一步说明如何使用行ID从未存储在内存中的对象中采样吗?只加载行ID。例如,如果是SQL表,则SQL行ID。如果对象没有行ID,那么将ID分配给行。完全没有,只需提供一个示例说明您的意思。我想《末日邮报》也有兴趣。@BrandonBertelsen:更好吗?