扩展 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 中的内存大小限制的主要内容,如果未能解决你的问题,请参考以下文章

服务器内存最大大小限制

是否可以增加 R 中的内存限制

超出 sysconfig 限制的共享内存大小

Java 使用的内存比堆大小(或正确大小的 Docker 内存限制)多得多

如何设置jvm的大小?jvm的大小收到哪些因素限制,例如系统可用虚拟内存

tomcat的内存如何限制大小