本文基本上是对《mahout in action》相关内容的读书笔记
推荐系统的好坏 大部分取决于 数据的质量和数量。正所谓“garbage in, garbage out”
1,user 对 item的 preference数据
Preference,一个接口,代表着 1个user(long) 对1个item (long) 的preference value(int),实现类有GenericPreference.
例如: new GenericPreference(123, 456, 3.0f)
PreferenceArray, 定义1个user对很多个item的pref, 或者1个item有很多user对其pref。具体实现类 GenericUserPreferenceArray, GenericItemPreferenceArray。
为什么不能用Collection<Preference> 呢? 因为java中object会消耗很多无关的内存(
参考:Java object内存大小计算),重新定义的 PreferenceArray在这方面节省很多。看下图的对比
按照java object内存大小计算方法,这样做优化,节省了75%的内存占用。这在大数据运算中可以节省几个G的内存占用
FastByIDMap 和
FastIDSet
*HashMap,FastByIDMap都是基于hash算法。不同的是,FastByIDMap使用 linear probing来处理hash冲突,而不是separate chaining。这样避免了给每一个entry添加Map.Entry 对象。对象消耗很多内存
*在Mahout推荐引擎里,key 和member都是long 类型,而不是Objects。使用long key可以节省内存并提升表现
*Set的底层不是用Map实现的
*FastByIDMap就想一个cache,他有一个最大size。当超过这个size的时候,不经常被用的entry就会被移除,然后加入新的。
从存储空间上比:FastIDSet每个member占用14 bytes,而hashSet占用84bytes
FashByIDMap 的entry消耗 28 bytes, 而hashMap消耗84 bytes