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'
或者将 NA
s 转换为 NULL
s 时。
# 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.
一起工作
创建 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'
或者将 NA
s 转换为 NULL
s 时。
# 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.
一起工作