2

我不确定那里有任何 R 用户,但以防万一:

我是 R 的新手,并被亲切地“传递”了以下 R 代码片段:

Beta <- exp(as.matrix(read.table('beta.transpose')))
WordFreq <- read.table('freq-matrix')
WordProbs <- WordFreq$V1 / sum(WordFreq)

infile <- file('freq-matrix')
outfile <- file('doc_topic_prob_matrix', 'w')

open(infile)
open(outfile)

for (i in 1:93049) {
  vec <- t(scan(infile, nlines=1))
  topics <- (vec/WordProbs) %*% Beta
  write.table(topics, outfile, append=T, row.names=F, col.names=F)
  }

当我尝试在我的数据集上运行它时,系统像疯了一样颠簸和交换。现在我意识到这有一个简单的原因:文件 freq-matrix 包含一个大(22GB)矩阵,我试图将它读入内存。

我被告知要使用Matrix包,因为 freq-matrix 到处都有很多很多零,它可以很好地处理这种情况。那会有帮助吗?如果是这样,任何有关如何更改此代码的提示都将受到欢迎。我没有 R 经验,只是开始阅读网站上提供的介绍 PDF。

非常感谢

〜l

4

2 回答 2

1

我的建议可能完全不成立,因为您没有提供有关文件内容的足够详细信息,我不得不从代码中猜测。无论如何,它来了。

你没有说明它,但我会假设你的代码在第二行崩溃,当你阅读大矩阵时。循环一次读取一行,并且不应该崩溃。您需要这个大矩阵的唯一原因是计算 WordProbs 向量。那么为什么不使用相同的循环重写该部分scan呢?事实上,您可能甚至不需要存储WordProbs向量,只需sum(WordFreq)- 您可以使用初始运行 hte 文件来获取它。然后重写循环内的公式来计算电流WordProb

于 2010-02-04T16:21:21.307 回答
0

迟到的答案,但我建议使用bigmemory包将数据读入内存映射文件。之后,我会寻找非零条目,然后可以将其表示为 3 列矩阵:(ix_row, ix_col, value)。这称为坐标对象列表 (COO),尽管名称并不重要。从那里,Matrix支持创建稀疏矩阵(通过sparseMatrix)。获得 COO 后,您就基本完成了 - 与稀疏矩阵格式之间的转换相当快。将矩阵乘以Beta应该相当快。如果您需要更快的速度,您可以使用优化的 BLAS 库,但这会带来更多问题。:)

于 2011-11-01T21:29:01.260 回答