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

paste0: could not allocate memory (0 Mb) in C function 'R_AllocStringBuffer'

创建 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);

来自 table 从 csv 文件读取

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

我连接插入字符串是为了确保将数据类型正确地放入插入语句中。字符串的长度最终变为 50 - 100 kB 左右。我通常 运行 几千个这样的插入没有问题。

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

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

或者将 NAs 转换为 NULLs 时。

# 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 任务管理器中看到),并且在执行期间 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。

通过对 x86_64, mingw32 系统使用 R version 3.6.1 (2019-07-05),我终于可以 运行 我的脚本没有这样的内存分配错误。因此,我可以 运行 整个 R 脚本生成并 运行 插入超过 10000 个查询块而不会出现问题,使用 64 位 R。

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

一起工作