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

Raj*_*Raj 5 apache-spark rdd apache-spark-mllib

我有一个相当简单的用例,但可能是非常大的结果集.我的代码执行以下操作(在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
Run Code Online (Sandbox Code Playgroud)

我发现无论何时通过调用count()或toLocalIterator来启动实际处理,我的操作最终都会因内存不足错误而结束.FPGrowth没有对我的数据进行分区吗?我的结果数据是如此之大,甚至连一个分区都会扼杀我的记忆?如果是的话,有没有办法我可以以"流"方式将RDD保存到磁盘而不试图将其保存在内存中?

感谢您的任何见解.

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

-Raj

zer*_*323 3

嗯,问题很可能是支持门槛。当您像这里一样设置非常低的值(我不会称之为百万分之一)时,您基本上会放弃向下封闭财产的所有好处。

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

编辑

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