gpt4 book ai didi

r - 修剪一个巨大的 (3.5 GB) csv 文件以读入 R

转载 作者:行者123 更新时间:2023-12-03 17:55:33 25 4
gpt4 key购买 nike

所以我有一个数据文件(分号分隔),它有很多细节和不完整的行(导致 Access 和 SQL 窒息)。它是县级数据集,分为段、子段和子子段(总共约 200 个因素),持续 40 年。简而言之,它很大,如果我试图简单地阅读它,它将无法放入内存。

所以我的问题是,鉴于我想要所有县,但只有一年(而且只是最高级别的分割......最终导致大约 100,000 行),最好的方法是什么这个汇总到R?

目前我正试图用 Python 剔除不相关的年份,通过一次读取和操作一行来绕过文件大小限制,但我更喜欢 R-only 解决方案(CRAN 包可以)。有没有类似的方法可以在 R 中一次读取一个文件?

任何想法将不胜感激。

更新:

  • 约束
  • 需要使用我的机器,所以没有EC2实例
  • 尽可能仅 R。在这种情况下,速度和资源不是问题...只要我的机器不爆炸...
  • 如下图所示,数据包含混合类型,我稍后需要对其进行操作
  • 资料
  • 数据为3.5GB,约850万行17列
  • 几千行 (~2k) 格式错误,只有一列而不是 17
  • 这些完全不重要,可以删除
  • 我只需要这个文件中的约 100,000 行(见下文)

  • 数据示例:
    County; State; Year; Quarter; Segment; Sub-Segment; Sub-Sub-Segment; GDP; ...
    Ada County;NC;2009;4;FIRE;Financial;Banks;80.1; ...
    Ada County;NC;2010;1;FIRE;Financial;Banks;82.5; ...
    NC [Malformed row]
    [8.5 Mill rows]

    我想去掉一些列并从 40 个可用年份(2009-2010 从 1980-2020)中选择两个,以便数据可以放入 R:
    County; State; Year; Quarter; Segment; GDP; ...
    Ada County;NC;2009;4;FIRE;80.1; ...
    Ada County;NC;2010;1;FIRE;82.5; ...
    [~200,000 rows]

    结果:

    在修改了所有提出的建议后,我决定使用 JD 和 Marek 建议的 readLines 效果最好。我给了 Marek 支票,因为他给出了一个示例实现。

    我在这里为我的最终答案复制了稍微改编的 Marek 实现版本,使用 strsplit 和 cat 只保留我想要的列。

    还应该注意的是,这比 Python 效率低得多……因为 Python 在 5 分钟内处理 3.5GB 的文件,而 R 需要大约 60 分钟……但如果你只有 R,那么这就是票。
    ## Open a connection separately to hold the cursor position
    file.in <- file('bad_data.txt', 'rt')
    file.out <- file('chopped_data.txt', 'wt')
    line <- readLines(file.in, n=1)
    line.split <- strsplit(line, ';')
    # Stitching together only the columns we want
    cat(line.split[[1]][1:5], line.split[[1]][8], sep = ';', file = file.out, fill = TRUE)
    ## Use a loop to read in the rest of the lines
    line <- readLines(file.in, n=1)
    while (length(line)) {
    line.split <- strsplit(line, ';')
    if (length(line.split[[1]]) > 1) {
    if (line.split[[1]][3] == '2009') {
    cat(line.split[[1]][1:5], line.split[[1]][8], sep = ';', file = file.out, fill = TRUE)
    }
    }
    line<- readLines(file.in, n=1)
    }
    close(file.in)
    close(file.out)

    方法失败:
  • sqldf
  • 如果数据格式正确,这绝对是我将来用于此类问题的方法。但是,如果不是,那么 SQLite 就会窒息。
  • MapReduce
  • 说实话,这些文档让我有点害怕,所以我没有去尝试。看起来它也需要对象在内存中,如果是这样的话,这将失去意义。
  • 大内存
  • 这种方法与数据有明确的联系,但它一次只能处理一种类型。结果,当放入 big.table 时,我所有的字符向量都掉了。如果我需要为 future 设计大型数据集,我会考虑只使用数字来保持这个选项的存在。
  • 扫描
  • Scan 似乎具有与大内存类似的类型问题,但具有 readLines 的所有机制。简而言之,这次它不符合要求。
  • 最佳答案

    我的尝试 readLines .这段代码创建了 csv与选定的年份。

    file_in <- file("in.csv","r")
    file_out <- file("out.csv","a")
    x <- readLines(file_in, n=1)
    writeLines(x, file_out) # copy headers

    B <- 300000 # depends how large is one pack
    while(length(x)) {
    ind <- grep("^[^;]*;[^;]*; 20(09|10)", x)
    if (length(ind)) writeLines(x[ind], file_out)
    x <- readLines(file_in, n=B)
    }
    close(file_in)
    close(file_out)

    关于r - 修剪一个巨大的 (3.5 GB) csv 文件以读入 R,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12334050/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com