0
  1. 假设我们有一个 (String, String)-Tuple 的迭代器。
  2. 所述迭代器有大量元素,可能会耗尽主内存。

如果你必须像下面这样聚合它,你会怎么做:

元组的形式为(entityname, attributename),您必须填充attributenames. 此外,迭代器将是完全无序的,并且永远不会放入内存中。

(例如,最后一个和第一个属性名称可以对应于相同的实体名称)。

一个具体的例子:

("stackoverflow","users"),
("bear","claws"),
("stackoverflow","usesAjaxTechnology"),
("bear","eyes") 

聚合后 -> :

("stackoverflow",List("users","usesAjaxTechnology")),
("bear",List("claws","eyes")).

我知道有statemenst likegroupBy等等,但这会假设迭代器有很多元素由于内存问题而永远无法工作?

4

2 回答 2

1

好吧,让我们看看 groupBy 做了什么:

scala> res0.groupBy(x => x._1)
res2: scala.collection.immutable.Map[String,List[(String, String)]] = 
    Map( bear -> List((bear,claws), (bear,eyes)),
         stackoverflow -> List((stackoverflow,users), (stackoverflow,usesAjaxTechnology))
    )

如您所见,它创建了一个Map元素。由于它是在内存中进行的,因此随着数据增长大于 RAM,您显然会遇到内存问题。

另一方面,可以构建一个类似 Map 的结构,而不是将所有数据保存在内存中,而是将它们写入文件系统。最简单的这种 Map 会为某个目录中的每个键(例如“bear”或“stackoverflow”)创建一个文件,并将所有属性写入相应的文件中。这几乎不需要内存使用,而是用非常高的磁盘使用率来代替它。

我想知道这是否是一种人为的要求,或者您是否真的面临一个真正的问题,这是一个问题。另外,我真的很想听听这里真正的函数式编程专家怎么说:)

于 2013-10-24T17:05:55.823 回答
0

如果您有这么多元素,我会假设它们位于某种类型的数据库或文件中。我会将它们以可管理的块取出并以这种方式处理它们,将它们写回数据库或新文件。这将解决您的内存问题并允许您执行这种处理。

如果您使用的是 MongoDb(我推荐),您的 find 查询可以轻松地仅提取 stackoverflow 用户,然后您的下一条语句可以将其写入新集合。和熊一样。

于 2013-10-24T17:09:08.350 回答