读取器导入 - 无法分配内存...在 C 函数中 'R_AllocStringBuffer'

标签 r readr

加载大型文本文件时遇到问题;我将在下面发布代码。该文件约为 65 GB,并使用“|”分隔。我有 10 个。我将在下面描述的过程适用于 9 个文件,但最后一个文件给我带来了麻烦。请注意,其他 9 个文件中约有一半大于此 - 约 70 GB。

# Libraries I'm using
library(readr)
library(dplyr)

# Function to filter only the results I'm interested in
f <- function(x, pos) filter(x, x[,41] == "CA")

# Reading in the file. 
# Note that this has worked for 9/10 files. 
tax_history_01 <- read_delim_chunked( "Tax_History_148_1708_07.txt", 
    col_types = cols(`UNFORMATTED APN` = col_character()), 
    DataFrameCallback$new(f), chunk_size = 1000000, delim = "|")

这是我收到的错误消息:
Error: cannot allocate vector of size 81.3 Mb
Error during wrapup: could not allocate memory (47 Mb) in C function 'R_AllocStringBuffer'

如果有帮助,Windows 会表示该文件为 69,413,856,071 字节,而 readr 表示 100% 为 66198 MB。我已经做了一些搜索,但真的不知道发生了什么。我有一点预感,文件可能有问题(例如缺少分隔符)。

编辑:只是我咨询的资源的一小部分。
更具体地说,给我带来麻烦的是“包装过程中的错误:......在 C 函数‘R_AllocStringBuffer’中”——我找不到太多关于这个错误的信息。

这篇文章中的一些语言让我相信已经达到了字符串向量的限制,并且可能存在解析错误。
R could not allocate memory on ff procedure. How come?

看到这个帖子,似乎我面临着不同的问题。对我来说,这不是一个真正的计算问题。
R memory management / cannot allocate vector of size n Mb

我引用了这篇关于清理我的工作空间的帖子。在一次导入中并不是真正的问题,而是当我运行脚本导入所有 10 个时的好习惯。
Cannot allocate vector in R of size 11.8 Gb

与此相关的更多主题:
R Memory "Cannot allocate vector of size N"

也发现了这个,但由于数据隐私的机器限制,它没有帮助:
https://rpubs.com/msundar/large_data_analysis

只需阅读一般的良好做法:
http://adv-r.had.co.nz/memory.html
http://stat.ethz.ch/R-manual/R-devel/library/base/html/Memory-limits.html

最佳答案

看看文件有多宽。如果这是一个非常宽的文件,那么您的 chunk_size = 1000000可能会使其成为一次读取的最大单个块,即使它不是最大的整体文件。

此外,请确保您正在释放( rm )先前读入的块,以便返回内存并再次可用。如果您依赖于前一个块的覆盖,那么您实际上已将内存需求增加了一倍。

关于读取器导入 - 无法分配内存...在 C 函数中 'R_AllocStringBuffer',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49060802/

相关文章:

r - 在 R 中循环以仅将前导零添加到指定长度

python - Pandas:解析 CSV,区分缺失值哨兵和恰好等于它的字符串

r - 处理 CSV 文件中包含分号的字符变量

r - readr()/read_csv中,如何导入所有列为字符的数据

r - 按 R 中的组为 RDA 向量着色

r - 从read.csv(file.choose())获取文件名

r - 如何在 R 中对 SessionInfo() 的输出进行排序?

r - 向 ggplot 添加一行

r - 如何将参数传递给 readr::read_csv_chunked 的回调函数

r - readr 中允许的 "col_*()"形式的列对象是什么?