在创建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。
答案 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一起使用。