Scala 处理大型迭代器-聚合 假设我们有一个(字符串,字符串)-元组的迭代器 所述迭代器具有kazillion元素,可能会耗尽主内存

Scala 处理大型迭代器-聚合 假设我们有一个(字符串,字符串)-元组的迭代器 所述迭代器具有kazillion元素,可能会耗尽主内存,scala,Scala,如果必须按以下方式进行聚合,您会怎么做: 元组的形式为(entityname,attributename),您必须填充属性名称的列表。此外,迭代器将完全无序,永远无法放入内存中 (例如,最后一个和第一个attibutename可以对应于相同的entityname) 一个具体的例子: ("stackoverflow","users"), ("bear","claws"), ("stackoverflow","usesAjaxTechnology"), ("bear","eyes") 聚合后->

如果必须按以下方式进行聚合,您会怎么做:

元组的形式为
(entityname,attributename)
,您必须填充
属性名称的列表。此外,迭代器将完全无序,永远无法放入内存中

(例如,最后一个和第一个attibutename可以对应于相同的entityname)

一个具体的例子:

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

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

我知道有一些状态,比如
groupBy
等等,但这会假设迭代器有很多元素由于内存问题而无法工作?

好吧,让我们看看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))
    )
如您所见,它创建了元素的
映射。因为它是在内存中进行的,所以当数据比RAM大时,显然会遇到内存问题

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


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

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


如果您使用的是MongoDb(我建议使用),那么find查询可以轻松地只提取stackoverflow用户,然后您的下一条语句可以将其写入新集合。熊也是如此。

你的问题很好,但如果你能在正确设置格式方面多下些功夫,那就太好了。标点符号也总是有助于提高可读性。答案的格式和可读性越好,人们回答它(至少对于不明显的问题:D)的可能性就越大,他们有一个累加器(来自
mutable.
HashMap[String,HashSet[String]]
?)并在填充累加器的迭代器中运行。因此,您可以控制内存占用。例如,当您看到有太多的元素时,您可能会将最旧的元素压缩到磁盘上。您如何才能将MongoDB(或任何其他具体的DB技术)纳入到这样一个一般问题的答案中呢D这就像得到一个问题“嘿,你知道我如何以一种快速舒适的方式从A移动到B吗?”然后你回答“是的,我建议你买一辆奔驰”…很简单用户问如何处理超过ram容量的数据,所以数据必须来自某个地方?它还必须被储存在某个地方。问题更像是“我怎样才能用我的掀背车搬运一千万块砖头”,答案是“你需要一辆自卸卡车”,除非他需要把砖头从一个岛上搬走,在这种情况下,一艘船可能是合适的。或者可能没有任何道路通往砖块所在的地方,所以可能需要一架直升机?如果跑道很近,他可能会使用飞机。或者,如果砖块只需要移动10米,推车和几个工人就足够了。如果某人住在一个岛上,你为什么要让他买一辆自卸车;)顺便说一句,我没有投你反对票。我只是认为MongoDB与它没有任何关系,应该忽略它,因为它完全是主观的。我不是说你不应该提到“数据库”,或者更具体的东西,比如“无模式、面向文档的数据库”,甚至“像MongoDB这样的面向文档的数据库”。但是你写它的方式,听起来太主观了。显然你可以把任何东西写进文件。我就像你在寻找一个非sied有效的解决方案(如果可能的话)