【发布时间】:2016-03-21 23:09:12
【问题描述】:
以下示例基于discussion 关于使用expand.grid 处理大数据。如您所见,它以错误告终。我猜这是由于可能的组合,根据mentioned page 687 亿:
> v1 <- c(1:8)
> v2 <- c(1:8)
> v3 <- c(1:8)
> v4 <- c(1:8)
> v5 <- c(1:8)
> v6 <- c(1:8)
> v7 <- c(1:8)
> v8 <- c(1:8)
> v9 <- c(1:8)
> v10 <- c(1:8)
> v11 <- c(1:8)
> v12 <- c(1:8)
> expand.grid(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12)
Error in rep.int(rep.int(seq_len(nx), rep.int(rep.fac, nx)), orep) :
invalid 'times' value
In addition: Warning message:
In rep.int(rep.int(seq_len(nx), rep.int(rep.fac, nx)), orep) :
NAs introduced by coercion to integer range
即使有八个向量,它也会杀死我的 CPU 和/或 RAM (> expand.grid(v1, v2, v3, v4, v5, v6, v7, v8))。 Here 我发现了一些改进建议使用outer 或rep.int。这些解决方案适用于两个向量,因此我无法将其应用于 12 个向量,但我想原理是相同的:它创建了驻留在内存中的大型矩阵。我想知道是否有类似 python 的 xrange 可以懒惰地评估? Here 我找到了delayedAssign 函数,但我想这无济于事,因为还提到了以下内容:
不幸的是,当惰性变量由 一个数据结构,即使当时不需要它们的值。这 意味着无限的数据结构,一种常见的应用 Haskell 中的懒惰,在 R 中是不可能的。
是否只使用嵌套循环来解决这个问题?
PS:我没有具体问题,但假设您需要使用接受 12 个整数参数的函数进行一些计算,出于某种原因。还假设您需要对这 12 个整数进行所有组合并将结果保存到文件中。使用 12 个嵌套循环并将结果连续保存到文件将起作用(尽管它会很慢但不会杀死你的 RAM)。 Here 展示了如何使用 expand.grid 和 apply 函数来替换两个嵌套循环。问题是使用expand.grid 创建这样的矩阵有12 个长度为8 的向量有一些缺点:
- 生成这样的矩阵很慢
- 如此大的矩阵消耗大量内存(687 亿行 8 列)
- 使用
apply对该矩阵进行进一步迭代也很慢
所以在我看来,功能性方法比程序性解决方案要慢得多。我只是想知道是否有可能懒惰地创建理论上不适合内存并对其进行迭代的大型数据结构。就是这样。
【问题讨论】:
-
什么问题?我看到一堆链接,对“它”的引用,以及来自 Python 的名为
xrange的东西。你能用一两句话说明你想要完成什么吗? -
你想要完成什么,你需要创造(甚至是幽灵)如此巨大的物体
-
有一个用于 R 的 iterators 包可能会有所帮助...
-
你能解释一下为什么我被否决了吗?请澄清什么不清楚或我应该提供什么进一步的信息。谢谢
标签: r lazy-evaluation infinite