【问题标题】:Loading CSV with fread stops because of to large string由于字符串过大,加载带有 fread 停止的 CSV
【发布时间】:2021-09-05 14:25:57
【问题描述】:

这是我正在使用的命令:

dallData <- fread("data.csv", showProgress = TRUE, colClasses = c(rep("NULL", 2), "character", rep("NULL", 37)))

但在尝试加载时出现此错误:R character strings are limited to 2^31-1 bytes|

无论如何要跳过这些值?

【问题讨论】:

  • 您可以尝试 vroom 并排除该列,尽管有些地方似乎不对 - 您的数据集中真的有 2.1Gb 字符串吗?或者 fread 没有正确读取数据...
  • 我无法排除该列,因为它是最重要的列。很难判断它是否正确读取我不知道错误的确切行。它确实正确读取了前几百万行,不过我已经对其进行了测试。
  • 您能否通过二分法缩小出现问题的行(即使用skipnrows 参数读取前半部分、后半部分、第二季度等...您甚至可以通过使用try()(和if (inherits(result, "try-error")) ... 来缩小问题的位置)自动执行此操作。
  • 听起来您的 CSV 格式可能有误。最可能的原因是引号不匹配。也许您可以请最初生成文件的人来修复错误。
  • 我试过你说的,但它似乎是随机的,我的 CSV 很好,它在 sql 中完美运行

标签: r performance csv ram


【解决方案1】:

以下策略可能有效,或者至少可以缩小可能的错误来源。它假定您有足够的工作内存来保存数据,并且您的分隔符实际上是逗号。如果您实际上有标签作为分隔符,那么您将需要相应地进行修改。计划是使用readLines 阅读,它基本上会忽略可能不匹配的引号。然后使用count.fieldstablewhich 找出哪条或哪条线路有问题。

 input <- readLines("data.csv")   # ignores quotes
 counts.def <- count.fields(textConnection(input),
                            sep=",")  # defaults quotes are both ' and "
 table(counts.def) # might show a variety of line counts.

# Second try with just double-quotes
 counts.dbl <- count.fields(textConnection(input),
                            sep=",", quote="\"") # just dbl-quotes
 table(counts.dbl) # if all the same, then all you do is change the quotes argument

根据结果,您可能需要编辑可以使用which(counts.def &lt; 40) 识别的某些行,假设其中大多数为 40,因为您的输入工作表明每行的预期字段数。

(如果[ram] 的标记意味着您受到限制并且收到警告或使用虚拟内存会严重减慢速度,那么您应该重新启动操作系统,并且在重试之前只加载 R。R 需要连续的内存块和Windoze 不太擅长内存管理。)

这里有一个小测试用例:

input <- readLines(textConnection(
"v1,v2,v3,v4,v5,v6 
text, text, text, text, text, text 
text, text, O'Malley, text,text,text 
junk,junk, more junk, \"text\", tex\"t, nothing 
3,4,5,6,7,8")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-16
    • 2014-02-12
    • 1970-01-01
    • 2023-03-28
    • 2021-12-16
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多