paste0:无法在C函数'R_AllocStringBuffer'中分配内存(0 Mb)

时间:2019-09-17 05:44:05

标签: r memory-management paste gsub

在创建INSERT语句时(对于Impala SQL)

INSERT INTO table (`field1`,...`field100`) VALUES
 ("column1", "column2", 0.001, 1, NULL, ..., 1, NULL), # Loop over inserted lines and columns
 ("column1", "column2", 0.001, 1, NULL, ..., 1, NULL), 
...
 ("column1", "column2", 0.001, 1, NULL, ..., 1, NULL);

从从csv文件读取的表中

MyData <- read.csv(file="C:/Users/user/R/file.csv", header=TRUE, sep=";")

我将插入字符串连接起来,以确保将数据类型正确放置到insert语句中。弦的长度最终变为50-100 kB。我通常会运行数千个这样的插入而不会出现问题。

但是,在修复数据类型时,我偶尔会遇到错误。例如,将数字转换为字符串时:

# Error in paste0(s, as.character(elem), ",") : 
#  could not allocate memory (0 Mb) in C function 'R_AllocStringBuffer'

或者将NA转换为NULL时。

# Error in paste0(s, "NULL,") : 
#  could not allocate memory (0 Mb) in C function 'R_AllocStringBuffer'

在上述错误中,s是使用paste0连接的字符串。

尽管没有关系,但我遇到了另一个问题(类似?),gsub

Error in gsub("\\n", " ", sqls) : 
  'Calloc' could not allocate memory (132871 of 1 bytes)

我确实保留了大约1.38 Gb的内存(可通过Windows Task Manager查看),并且在执行过程中R的内存使用量不超过1.4 Gb。仍然有足够的内存要保留。我试图强迫垃圾收集

# Try gargabe collection to prevent memory allocation errors:
gc()
gcinfo(verbose=FALSE)

但这不能解决内存问题,因为错误不是由于内存不足所致。

我在R version 3.5.3 (2019-03-11)(i386,mingw32)上遇到的上述错误。我也尝试过R version 3.6.1(i386,mingw32),但是遇到了类似的错误:

Error in paste0(substr(s, 1, nchar(s) - 1), "),") : 
  could not allocate memory (0 Mb) in C function 'R_AllocStringBuffer'

因此更新R版本不是解决方案,根据Windows任务管理器的说法,现在的内存消耗似乎是3.5.3的两倍,约为2.66 Gb。

1 个答案:

答案 0 :(得分:0)

通过将R version 3.6.1 (2019-07-05)用于x86_64, mingw32系统,我终于可以在没有这种内存分配错误的情况下运行脚本。因此,使用64位R,我可以运行整个R脚本,并生成并运行超过10000个插入查询块。

我犹豫是否更改为64位R,因为某些基于Java的ODBC驱动程序需要32位驱动程序。但是至少在这种情况下,我需要的hive-jdbc-uber驱动程序与64位Java和64位R一起使用。