处理大型迭代器 - 聚合

时间:2013-10-24 16:38:56

标签: scala

  1. 假设我们有一个(字符串,字符串)-Tuple的迭代器。
  2. 说Iterator有许多元素,可能耗尽主要记忆。
  3. 如果必须按以下方式聚合,您会怎么做:

    元组的格式为(entityname, attributename),您必须填充attributenames的列表。迭代器也是完全无序的,永远不会适合内存。

    (例如,最后一个和第一个attibutename可能对应于同一个实体名称。)

    一个具体的例子:

    ("stackoverflow","users"),
    ("bear","claws"),
    ("stackoverflow","usesAjaxTechnology"),
    ("bear","eyes") 
    
    聚合后

    - > :

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

    我知道有像groupBy这样的状态,但是这会假设迭代器有一个由于内存问题而无法工作的元素吗?

2 个答案:

答案 0 :(得分: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”)创建一个文件,并将所有属性写入相应的文件中。这几乎不需要内存使用,取而代之的是磁盘使用率非常高。

我想知道这是否是一种人为的要求,或者如果你真的面临一个真正的问题,这是一个问题。另外,我真的很想听听这里真正的函数式编程专业人士所说的内容:)

答案 1 :(得分:0)

如果你有那么多元素,我会认为它们属于某种类型的数据库或文件。我会以可管理的块来处理它们并以这种方式处理它们,将它们写回db或新文件。这将解决您的内存问题,并允许您执行此类处理。

如果您正在使用MongoDb(我推荐),您的查找查询可以轻松地仅提取stackoverflow用户,然后您的下一个语句可以将其写入新集合。与熊相同。