【问题标题】:R vegan simper analysis running out of memoryR vegan simper 分析内存不足
【发布时间】:2015-01-05 22:19:43
【问题描述】:

我正在尝试使用 R 在大型数据集上执行 simper analysis (vegan package);我在具有较小数据集的本地机器(10 核,16GB 内存)上运行它取得了一些成功。然而,当我扩展我的分析以包含更大的数据集时,代码以错误终止,例如:

error: cannot allocate vector of size XX gb

所以,我尝试对一个 Amazon AWS 实例(更具体地说,一个 r3.8xlarge 实例:32 核,244GB ram)进行相同的分析,但我得到了同样的错误,这次最具体的是:

error: cannot allocate vector of size 105.4 gb

我尝试过的两个系统(本地和 AWS)都是 Ubuntu 机器,并且有一个 sessionInfo()

R version 3.0.2 (2013-09-25)
Platform: x86_64-pc-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C
 [9] LC_ADDRESS=C               LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

以下是我正在运行的相关代码行:

# read in data as DFs for mapping file
print("Loading mapping file...")
map_df = read.table(map, sep="\t", header=TRUE, strip.white=T)
rownames(map_df) = map_df[,1] # make first column the index so that we can join on it
map_df[,1] <- NULL # remove first column (we just turned it into the index)

# read in data as DF for biom file
print("Loading biom file...")
biom_df = data.frame(read.table(biom_file, sep="\t", header=TRUE), stringsAsFactors=FALSE)
biom_cols = dim(biom_df)[2] # number of columns in biom file, represents all the samples
otu_names <- as.vector(biom_df[,biom_cols]) # get otu taxonomy (last column) and save for later
biom_df[,biom_cols] <- NULL # remove taxonomy column
biom_df <- t(biom_df) # transpose to get OTUs as columns
biom_cols = dim(biom_df)[2] # number of columns in biom file, represents all the OTUs (now that we've transposed)

# merge our biom_df with map_df so that we reduce the samples down to those given in map_df
merged = merge(biom_df, map_df, by="row.names")
merged_cols = dim(merged)[2]

# clear some memory
rm(biom_df)
print("Total memory used:")
print(object.size(x=lapply(ls(), get)), units="Mb")


# simper analysis
print("Running simper analysis...")
sim <- simper(merged[,2:(biom_cols+1)], merged[,merged_cols], parallel=10)

有什么想法吗?

【问题讨论】:

    标签: r out-of-memory vegan


    【解决方案1】:

    根据您提供的信息,尚不清楚您的机器在哪一点内存不足。您似乎在分析中使用了基本 R 函数。您可能想尝试一下 data.table 包(查看比 read.table 快得多的 fread 函数)。

    【讨论】:

    • 它在 simper() 调用期间用完
    • 似乎更简单只需要合并的数据框 biom_cols 和 merge_cols。您是否尝试过从内存中删除除那些之外的所有内容?您应该可以使用 rm(list=setdiff(ls(), c("merged", "biom_cols", "merged_cols"))) 来做到这一点。
    • 在我创建的两个数据帧(biom_df 和 map_df)中,只有 biom_df 非常大(map_df 非常小)。我已经包含了一个rm(biom_df) 来清理内存,因此没有太多其他内存需要清理(我不认为)
    • 在不知道您正在处理的数据框大小的情况下,很难说它是否有用。您还可以尝试分别创建两个输入数据帧,然后再将其输入 simper() 并摆脱合并的。如果 merge_cols 和 biom_cols 的并集等于合并中的所有列,这将无济于事。
    • 您也可以尝试利用 data.table 的按引用传递属性,以便最大限度地减少内存中数据帧的重复。我不确定确切的机制是什么,但找到了这篇文章link
    猜你喜欢
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 2014-08-01
    • 2015-11-09
    相关资源
    最近更新 更多