R和数据挖掘内存不够?
R and data mining not enough memory?
我将 R 用于数据挖掘目的,问题是我将它与 elasticsearch 连接起来并检索了莎士比亚全集的数据集。
library("elastic")
connect()
maxi <- count(index = 'shakespeare')
s <- Search(index = 'shakespeare',size=maxi)
dat <- s$hits$hits[[1]]$`_source`$text_entry
for (i in 2:maxi) {
dat <- c(dat , s$hits$hits[[i]]$`_source`$text_entry)
}
rm(s)
因为我只想要对话,所以我必须做一个 for 才能得到那个。对象 's' 大约 250 Mb 而 'dat' 只有 10 Mb。
之后我想做一个 tf_idf 矩阵但显然我不能因为它使用太多内存(我有 4GB 的 RAM),这是我的代码:
library("tm")
myCorpus <- Corpus(VectorSource(dat))
myCorpus <- tm_map(myCorpus, content_transformer(tolower),lazy = TRUE)
myCorpus <- tm_map(myCorpus, content_transformer(removeNumbers),lazy = TRUE)
myCorpus <- tm_map(myCorpus, content_transformer(removePunctuation),lazy = TRUE)
myCorpus <- tm_map(myCorpus, content_transformer(removeWords), stopwords("en"),lazy = TRUE)
myTdm <- TermDocumentMatrix(myCorpus,control = list(weighting = function(x) weightTfIdf(x, normalize = FALSE)))
myCorpus 大约有 400 Mb。
但后来我做了:
> m <- as.matrix(myTdm)
Error in vector(typeof(x$v), nr * nc) : vector size cannot be NA
In addition: Warning message:
In nr * nc : NAs produced by integer overflow
有什么想法吗? R 数据集是否太多了?
编辑:
RemoveSparseTerms 效果不佳,我使用 sparse = 0.95 并留下 0 个术语:
inspect(myTdm)
<<TermDocumentMatrix (terms: 27227, documents: 111396)>>
Non-/sparse entries: 410689/3032568203
Sparsity : 100%
Maximal term length: 37
Weighting : term frequency (tf)
术语文档矩阵通常包含很多零;很多术语只会出现在一个文档中。 tm
库将术语文档矩阵存储为稀疏矩阵,这是一种 space 存储此类矩阵的有效方式。 (您可以在此处阅读有关 tm
使用的存储格式的更多信息:http://127.0.0.1:19303/library/slam/html/matrix.html)
当您尝试转换为正则矩阵时,space 效率会大大降低,并且会导致 R 运行 内存不足。您可以使用
removeSparseTerms
在转换为矩阵之前,尝试使整个矩阵足够小以供使用。
我很确定这就是正在发生的事情,但如果不能 运行 在您的计算机上执行您的代码,则很难确定。
我将 R 用于数据挖掘目的,问题是我将它与 elasticsearch 连接起来并检索了莎士比亚全集的数据集。
library("elastic")
connect()
maxi <- count(index = 'shakespeare')
s <- Search(index = 'shakespeare',size=maxi)
dat <- s$hits$hits[[1]]$`_source`$text_entry
for (i in 2:maxi) {
dat <- c(dat , s$hits$hits[[i]]$`_source`$text_entry)
}
rm(s)
因为我只想要对话,所以我必须做一个 for 才能得到那个。对象 's' 大约 250 Mb 而 'dat' 只有 10 Mb。
之后我想做一个 tf_idf 矩阵但显然我不能因为它使用太多内存(我有 4GB 的 RAM),这是我的代码:
library("tm")
myCorpus <- Corpus(VectorSource(dat))
myCorpus <- tm_map(myCorpus, content_transformer(tolower),lazy = TRUE)
myCorpus <- tm_map(myCorpus, content_transformer(removeNumbers),lazy = TRUE)
myCorpus <- tm_map(myCorpus, content_transformer(removePunctuation),lazy = TRUE)
myCorpus <- tm_map(myCorpus, content_transformer(removeWords), stopwords("en"),lazy = TRUE)
myTdm <- TermDocumentMatrix(myCorpus,control = list(weighting = function(x) weightTfIdf(x, normalize = FALSE)))
myCorpus 大约有 400 Mb。
但后来我做了:
> m <- as.matrix(myTdm)
Error in vector(typeof(x$v), nr * nc) : vector size cannot be NA
In addition: Warning message:
In nr * nc : NAs produced by integer overflow
有什么想法吗? R 数据集是否太多了?
编辑:
RemoveSparseTerms 效果不佳,我使用 sparse = 0.95 并留下 0 个术语:
inspect(myTdm)
<<TermDocumentMatrix (terms: 27227, documents: 111396)>>
Non-/sparse entries: 410689/3032568203
Sparsity : 100%
Maximal term length: 37
Weighting : term frequency (tf)
术语文档矩阵通常包含很多零;很多术语只会出现在一个文档中。 tm
库将术语文档矩阵存储为稀疏矩阵,这是一种 space 存储此类矩阵的有效方式。 (您可以在此处阅读有关 tm
使用的存储格式的更多信息:http://127.0.0.1:19303/library/slam/html/matrix.html)
当您尝试转换为正则矩阵时,space 效率会大大降低,并且会导致 R 运行 内存不足。您可以使用
removeSparseTerms
在转换为矩阵之前,尝试使整个矩阵足够小以供使用。
我很确定这就是正在发生的事情,但如果不能 运行 在您的计算机上执行您的代码,则很难确定。