我有一个相当简单的用例,但可能是非常大的结果集。我的代码执行以下操作(在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没有对我的数据进行分区吗?我的结果数据是如此之大,以至于连一个分区都会扼杀我的记忆?如果是的话,有没有办法可以在流式传输中将RDD持久化到磁盘上。时尚而不试图把它放在记忆中?
感谢您的任何见解。
编辑: FPGrowth的一个基本限制是整个FP树必须适合内存。因此,有关提高最低支持门槛的建议是有效的。
-Raj
答案 0 :(得分:2)
嗯,问题很可能是支持门槛。当你像这里设置一个非常低的值(我不会经常调用百万分之一)时,你基本上会抛弃向下关闭属性的所有好处。
这意味着所考虑的项目集数量呈指数增长,在最坏的情况下,它将等于2 N - 1m,其中N是项目数。除非您的玩具数据数量非常少,否则根本不可行。
修改强>:
请注意,对于约200K的事务(从注释中获取的信息)和支持阈值1e-6,数据中的每个项目集都必须经常出现。所以你在这里尝试做的基本上就是枚举所有观察到的项目集。