Spark Mllib FPGrowth 作业因内存错误而失败

Spark Mlib FPGrowth job fails with Memory Error

我有一个相当简单的用例,但结果集可能非常大。我的代码执行以下操作(在 pyspark shell 上):

from pyspark.mllib.fpm import FPGrowth
data = sc.textFile("/Users/me/associationtestproject/data/sourcedata.txt")
transactions = data.map(lambda line: line.strip().split(' '))
model = FPGrowth.train(transactions, minSupport=0.000001, numPartitions=1000)
# Perform any RDD operation
for item in model.freqItemsets().toLocalIterator():
    # do something with item

我发现每当我通过调用 count() 或 toLocalIterator 开始实际处理时,我的操作最终都会以内存不足错误结束。 FPGrowth 没有对我的数据进行分区吗?我的结果数据是否太大以至于即使是单个分区也会占用我的内存?如果是,有没有一种方法可以以 "streaming" 的方式将 RDD 持久保存到磁盘,而无需尝试将其保存在内存中?

感谢您的任何见解。

编辑: FPGrowth 的一个基本限制是整个 FP 树必须适合内存。因此,提高最低支持门槛的建议是有效的。

-拉吉

好吧,问题很可能是支持阈值。当你像这里一样设置一个非常低的值时(我不会经常调用 one-in-a-million)你基本上放弃了 downward-closure 属性.

的所有好处

这意味着考虑的项目集数量呈指数增长,在最坏的情况下它将等于 2N - 1m,其中 N 是项目的数量。除非您的玩具数据包含的物品数量非常少,否则这是不可行的。

编辑:

请注意,对于约 20 万笔交易(从评论中获取的信息)和支持阈值 1e-6,您数据中的每个项目集都必须是频繁的。所以基本上你在这里要做的是枚举所有观察到的项目集。