作者回复: 非常好的点。生产环境我们一般选择提前载入一些warm up物品id的方式载入物品embedding。这里做了一个简化,推荐大家参考这条评论,多谢!
作者回复: 生产环境确实经常使用protobuf进行压缩,非常好的经验。
作者回复: 优秀。非常好的经验之谈,推荐其他同学学习。
作者回复: 这两个问题都是非常好的问题,推荐其他同学思考。 1. 我们并没有把用户embedding保存在内存中,只是把item embedding提前load到内存里,所以其实不存在这样的情况。但你说的也是非常好的用户数据缓存的方案,我们一般会指定一个用户内存区域的大小,用FIFO的方案来缓存,这样内存用完了,就自动把早进来的用户pop出去。 另外分级的想法也非常好,如果有条件可以判断活跃用户,可以尽量选择活跃用户进行缓存。 2、你说的没错,用户emb和物品emb必须在一个向量空间内才能够做相似度计算。咱们项目中的用户emb是通过item emb平均生成的,所以可以这样计算。
作者回复: 是这样,长期兴趣或这说周期比较长的metadata特征,按天写入特征数据库,实时特征进行实时更新。
作者回复: 一般来说Cassandra的读性能会比HBase好很多,包括类似的AWS用的dynamoDB,现在用得多一些。 但也有对HBase的读性能做优化的,比如加缓存,做一些读取命令的优化,但作为服务线上的实时数据库,确实会用的少一些。
作者回复: 在线服务内部可以有各种载入和维护feature的缓存逻辑。最简单比如设置一个timer去定期load热门的新feature。不用重启服务器。
作者回复: 这个肯定会存在。但我觉得要点还得具体问题具体分析,要看一下物品和用户特征有没有必要完全协同的更新,比如物品历史ctr这个特征,完全可以独立更新。 如果一定要一起更新,那么就只能在streaming平台上每次都协同更新这些特征。 我个人觉得有一些秒级、分钟级的差异,影响不会那么大,没有那么关键。
作者回复: 那按照咱们这节课讲的分级存储的原则,内存里面放不下,应该怎么解决这个问题呢?能不能放一些经常访问的在内存里,长尾的放在其他地方?或者经常用的特征放内存里等等方法?
作者回复: spark本质上是一个java lib,所以可以被maven安装依赖。 redis是一个数据库,需要按照文中的方式安装到电脑上。