【发布时间】:2014-11-27 10:21:19
【问题描述】:
我想创建一个特定的 data.table 来检查丢失的数据。 在这种情况下,缺少数据并不意味着会有 NA,而是整行都会被遗漏。因此,我需要能够查看某个与时间相关的列,而另一列的哪个级别缺少哪些值。同样重要的是是否存在大量缺失值,或者它们是否分布在数据集中。
所以我有这个 6.000.000x5 的 data.table(称之为 TableA),其中包含时间相关变量、级别的 ID 和我想添加到最终表格中的值 N。
我有另一个 207x2 的表 (TableB)。这会将因子的 ID 耦合到 TableC 中的列。
TableC 为 1.500.000x207,其中 207 列中的每一列对应 TableB 中的 ID,行对应 TableA 中的时间相关变量。
这些表很大,虽然我最近获得了额外的 RAM(现在总计 8GB),但我的计算机一直在交换 TableC,每次写入都必须回调它,然后再被交换掉。这种交换是我所有时间的消耗。 TableA 的每行大约需要 1.6 秒,并且由于 TableA 有 6.000.000 行,因此此操作将需要超过 100 天的不间断运行..
目前我正在使用 for 循环来循环 TableA 的行。不做任何操作,这个 for 循环几乎立即循环。我做了一个单行命令,在 TableA 和 TableB 中查找 TableC 的正确列号和行号,并将 TableA 中的值写入 TableC。 我打破了这个单线进行系统时间分析,除了写入大 TableC 之外,每个步骤大约需要 0 秒。 这表明将值写入表是最耗时的,并且查看我的内存使用情况,我可以看到每当写入发生时都会出现一个巨大的块,并且一旦完成它就会消失。
TableA <- data.table("Id"=round(runif(200, 1, 100)), "TimeCounter"=round(runif(200, 1, 50)), "N"=round(rnorm(200, 1, 0.5)))
TableB <- data.table("Id"=c(1:100),"realID"=c(100:1))
TSM <- matrix(0,ncol=nrow(TableB), nrow=50)
TableC <- as.data.table(TSM)
rm(TSM)
for (row in 1:nrow(TableA))
{
TableCcol <- TableB[realID==TableA[row,Id],Id]
TableCrow <- (TableA[row,TimeCounter])
val <- TableA[row,N]
TableC[TableCrow,TableCcol] <- val
}
谁能告诉我如何通过在 for 循环的最后一步防止内存交换来加快此操作?
编辑:根据@Arun 的建议,我花了一些时间开发一些虚拟数据进行测试。它现在包含在上面给出的代码中。 我没有包括想要的结果,因为虚拟数据是随机的,并且例程确实有效。问题在于速度。
【问题讨论】:
-
请提供您的问题的最小可重现示例,以及您需要的解决方案。 ATM 后面的文字太多了。
-
我可以提供一些代码,但没有数据。另外,如何生成可重现的内存问题示例?
-
让我想想.. 你可以提供代码来生成你的表的小数据集。然后告诉我们你的代码是什么。然后向我们展示该代码的结果。然后解释这不会扩展到您的数据维度。然后询问如何解决内存问题。另外,您说内存问题,并以“如何使此操作更快?”结束您的帖子。
-
也许你应该阅读我的问题的其余部分 :) 缓慢是因为内存交换问题。
-
你是对的。我会让别人接手。祝你好运。
标签: r performance memory data.table