扩展 R 中的内存大小限制
Posted
技术标签:
【中文标题】扩展 R 中的内存大小限制【英文标题】:Extend memory size limit in R 【发布时间】:2011-04-21 19:48:54 【问题描述】:我有一个 R 程序,它结合了 10 个文件,每个文件大小为 296MB,我已将内存大小增加到 8GB(RAM 大小)
--max-mem-size=8192M
当我运行这个程序时,我得到一个错误提示
In type.convert(data[[i]], as.is = as.is[i], dec = dec, na.strings = character(0L)) :
Reached total allocation of 7646Mb: see help(memory.size)
这是我的 R 程序
S1 <- read.csv2("C:/Sim_Omega3_results/sim_omega3_1_400.txt");
S2 <- read.csv2("C:/Sim_Omega3_results/sim_omega3_401_800.txt");
S3 <- read.csv2("C:/Sim_Omega3_results/sim_omega3_801_1200.txt");
S4 <- read.csv2("C:/Sim_Omega3_results/sim_omega3_1201_1600.txt");
S5 <- read.csv2("C:/Sim_Omega3_results/sim_omega3_1601_2000.txt");
S6 <- read.csv2("C:/Sim_Omega3_results/sim_omega3_2001_2400.txt");
S7 <- read.csv2("C:/Sim_Omega3_results/sim_omega3_2401_2800.txt");
S8 <- read.csv2("C:/Sim_Omega3_results/sim_omega3_2801_3200.txt");
S9 <- read.csv2("C:/Sim_Omega3_results/sim_omega3_3201_3600.txt");
S10 <- read.csv2("C:/Sim_Omega3_results/sim_omega3_3601_4000.txt");
options(max.print=154.8E10);
combine_result <- rbind(S1,S2,S3,S4,S5,S6,S7,S8,S9,S10)
write.table(combine_result,file="C:/sim_omega3_1_4000.txt",sep=";",
row.names=FALSE,col.names=TRUE, quote = FALSE);
谁能帮帮我
谢谢,
修罗提。
【问题讨论】:
错误发生在哪里? 你知道分号不需要放在行尾吧? 如果您所做的只是聚合文件,您可能想尝试直接使用 bash 或 DOS。很容易在谷歌上搜索,这个 SO 问题可能会有所帮助:***.com/questions/4827453/… 在 R 启动之前您有多少可用 RAM?也许其他一些进程会消耗一切。 【参考方案1】:我建议将这些建议合并到?read.csv2
:
内存使用情况:
These functions can use a surprising amount of memory when reading large files. There is extensive discussion in the ‘R Data Import/Export’ manual, supplementing the notes here. Less memory will be used if ‘colClasses’ is specified as one of the six atomic vector classes. This can be particularly so when reading a column that takes many distinct numeric values, as storing each distinct value as a character string can take up to 14 times as much memory as storing it as an integer. Using ‘nrows’, even as a mild over-estimate, will help memory usage. Using ‘comment.char = ""’ will be appreciably faster than the ‘read.table’ default. ‘read.table’ is not the right tool for reading large matrices, especially those with many columns: it is designed to read _data frames_ which may have columns of very different classes. Use ‘scan’ instead for matrices.
【讨论】:
【参考方案2】:内存分配需要连续的块。文件在磁盘上占用的大小可能不能很好地指示对象在加载到 R 中时有多大。你能用函数查看这些 S 文件之一吗:
?object.size
这是我用来查看 R 中占用最多空间的函数:
getsizes <- function() z <- sapply(ls(envir=globalenv()),
function(x) object.size(get(x)))
(tmp <- as.matrix(rev(sort(z))[1:10]))
【讨论】:
【参考方案3】:如果你在计算 combine_result 之后remove(S1,S2,S3,S4,S5,S6,S7,S8,S9,S10)
然后gc()
,你可能会释放足够的内存。我还发现,如果你在 Windows 上,通过 RScript 运行它似乎比通过 GUI 访问更多的内存。
【讨论】:
查看 OP 错误消息我猜他没有达到计算combine_result
的步骤...【参考方案4】:
如果这些文件是标准格式,并且您想在 R 中执行此操作,那么为什么还要读/写 csv。使用readLines
/writeLines
:
files_in <- file.path("C:/Sim_Omega3_results",c(
"sim_omega3_1_400.txt",
"sim_omega3_401_800.txt",
"sim_omega3_801_1200.txt",
"sim_omega3_1201_1600.txt",
"sim_omega3_1601_2000.txt",
"sim_omega3_2001_2400.txt",
"sim_omega3_2401_2800.txt",
"sim_omega3_2801_3200.txt",
"sim_omega3_3201_3600.txt",
"sim_omega3_3601_4000.txt"))
file.copy(files_in[1], out_file_name <- "C:/sim_omega3_1_4000.txt")
file_out <- file(out_file_name, "at")
for (file_in in files_in[-1])
x <- readLines(file_in)
writeLines(x[-1], file_out)
close(file_out)
【讨论】:
嗨 Marek,我在执行程序时遇到错误错误是 file_out @Shruti 你对C:
有写权限吗?您可以检查file.exists(out_file_name)
,应该是TRUE
,或者检查您的磁盘上是否存在file.copy
C:/sim_omega3_1_4000.txt
。还要检查file.exists(files_in)
是否都是TRUE
。
谢谢我检查了文件是否存在并运行程序它没有工作。我专门创建了一个名为 out_file_name 的文件但没有运气......
@Shruti: out_file_name 是一个变量,需要设置成具体的路径和文件名...以上是关于扩展 R 中的内存大小限制的主要内容,如果未能解决你的问题,请参考以下文章
Java 使用的内存比堆大小(或正确大小的 Docker 内存限制)多得多