readr import - 无法在C函数中分配内存... R_AllocStringBuffer'

时间:2018-03-02 00:12:12

标签: 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。我已经做了一些搜索,并且确实无法了解发生了什么。我有一个小小的预感,文件可能有问题(例如缺少分隔符)。

编辑:只是我咨询过的一小部分资源样本。 更具体地说,给我带来麻烦的是&#34;包装过程中的错误:...在C函数&#39; R_AllocStringBuffer&#39; &#34; - 我对这个错误找不到多少。

这篇文章中的一些语言让我相信已达到字符串向量的限制,并且可能存在解析错误。 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

2 个答案:

答案 0 :(得分:1)

查看文件的宽度。如果这是一个非常宽的文件,则您的// below is base64 String snippet. var base64Str = "0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAOwADAP7/CQAGAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAA\r\nEAAA/v///wAAAAD+////AAAAAAEAAAD/////////////////////////////////////////////\r\n////////////////////////////////////////////////////////////////////////////\r\n////////////////////////////////////////////////////////////////////////////\r\n////////////////////////////////////////////////////////////////////////////\r\n////////////////////////////////////////////////////////////////////////////\r\n////////////////////////////////////////////////////////////////////////////\r\n////////////////////////////////////////////////////////////////////////////\r\n//////////////////////////////////////////////////////////////////////////9S\r\nAG8AbwB0ACAARQBuAHQAcgB5AAAAAAAAAAAAAA ........."; base64Str = base64Str.replace(/\\r\\n/g,""); var decoder = Ext.util.Base64.decode(fileStr); testApp.view.main.FileExport.saveAs(decoder,'SHANGTOUDI_JF_20180320_0800.xls','UTF-8'); } 可能使它成为一次可以读取的最大单个块,即使它不是最大的整体文件也是如此。

此外,请确保释放(chunk_size = 1000000)先前读取的块,以便返回内存并再次可用。如果您依靠上一个块的覆盖,那么您实际上已经使内存需求增加了一倍。

答案 1 :(得分:0)

我只是遇到了这个错误-我浏览了maxo的链接,阅读了评论,仍然没有解决方法。

以我为例,原来我正在读取的csv在复制过程中已损坏(使用md5sum检查对此进行了检查,事后看来,我应该立即执行此操作)。

我猜发生了什么事,是由于损坏的数据的性质,有一个打开的引号没有其对应的结束引号,导致文件的其余部分作为一个VERRRRYY LARRRGE字符串读入。那是我的猜测。

无论如何,希望这对以后的人有所帮助:-)。