为每个用户检索最相关输出的最佳解决方案(在 Django 或任何后端中)?
The best solution to retrieve the most relevant outputs to the each user (in Django or any Backend)?
我正在寻找为每个用户检索最相关输出的最佳解决方案。
我将模型简化为 UserProfile 和 Groups,如下所示
-Model Name: UserProfile
styles: ['a', 'b', 'f', 'r'] <- ('styles' are field name)
-Group 1
styles: ['a', 'f']
-Group 2
['g', 'a', 'h']
...
-Group 1,000,000
styles: ['s', 'w', 'x']
(Let's say we have millions of Groups)
我想根据用户的风格对组进行排序和检索。
所以在这种情况下,'Group 1' 得分 2 因为样式 'a'、'f'、
'Group 2' 得分 1 因为风格 'a'。
我们无法将分数存储在我们的主数据库中,因为每个用户都有不同的风格。
- 我的方法1:每次用户请求时对所有数据库进行排名(我概念性地写了一个代码)
views.py
for group in Group.objects.all():
# store the score to the new field of the group
group.style_count = group.styles.join_count(user.styles)
list_view_output = Group.objects.order_by(style_count)
- 方法 2:将排名存储在数据库中
执行查询并将输出(当然还有等级和用户 ID)存储在 Redis 内存缓存数据库中。并在特定用户想要
时检索结果
心中的问题:
- 查询似乎很昂贵。 O(n) 迭代 * O( min( user.style.count(), group.style.count() ) ) 加入。我怎样才能做得更好?也许我可以在模型中做点什么?
- 不幸的是,如果我们有 100 万个组和 1000 个用户,我需要在缓存内存 (Redis) 中存储 10 亿行。而且我绝对买不起(我想我最多可以有 8GB,或者更多)
- 也许我不需要将每个用户的排名数据都存储在缓存中,因为有些用户具有相同的样式。您知道这方面的任何 AI 方法吗?
您能否提供任何建议来更好地构建它?
谢谢...!!!!!
底线是,对于数百万规模的问题,保存所有内容并对其进行排序可能不是一个好主意。
使用当前的数据结构,
- 时间复杂度:O(n);几乎不可能减少
- space 复杂性:我们可以改进很多。例如只需要前 10 个,成本可以是 O(1)。我们只能以排序的方式保存前 10 名。在线性扫描中,我们只将新组的分数与最小的分数进行比较,如果新分数更大,则将其替换
但一个可能的问题是,如果你有太多相同分数的组,那么这可能是一个问题。你需要小心处理。
如果您以 'sorted' 的方式组织样式和组,可能会更快。
例如,按字母顺序,第 2 组将是 ['a'、'g'、'h']。我们跟踪第一个或几个字母的索引。例如,以'a'开头的群组为第一批;然后是 'b' 开头的组,依此类推。
在您的情况下,您可以通过以下方式进行搜索:
1. 首先是'a'开头的组;
2.然后搜索以'b'开头的组;
3. 然后 'f';
4. 然后 'r'。
所以那些在 [a, b, f, r] 中没有任何样式的组不会被触及。
这样,可以为您节省很多时间。
我正在寻找为每个用户检索最相关输出的最佳解决方案。
我将模型简化为 UserProfile 和 Groups,如下所示
-Model Name: UserProfile
styles: ['a', 'b', 'f', 'r'] <- ('styles' are field name)
-Group 1
styles: ['a', 'f']
-Group 2
['g', 'a', 'h']
...
-Group 1,000,000
styles: ['s', 'w', 'x']
(Let's say we have millions of Groups)
我想根据用户的风格对组进行排序和检索。 所以在这种情况下,'Group 1' 得分 2 因为样式 'a'、'f'、 'Group 2' 得分 1 因为风格 'a'。
我们无法将分数存储在我们的主数据库中,因为每个用户都有不同的风格。
- 我的方法1:每次用户请求时对所有数据库进行排名(我概念性地写了一个代码)
views.py
for group in Group.objects.all():
# store the score to the new field of the group
group.style_count = group.styles.join_count(user.styles)
list_view_output = Group.objects.order_by(style_count)
- 方法 2:将排名存储在数据库中 执行查询并将输出(当然还有等级和用户 ID)存储在 Redis 内存缓存数据库中。并在特定用户想要 时检索结果
心中的问题:
- 查询似乎很昂贵。 O(n) 迭代 * O( min( user.style.count(), group.style.count() ) ) 加入。我怎样才能做得更好?也许我可以在模型中做点什么?
- 不幸的是,如果我们有 100 万个组和 1000 个用户,我需要在缓存内存 (Redis) 中存储 10 亿行。而且我绝对买不起(我想我最多可以有 8GB,或者更多)
- 也许我不需要将每个用户的排名数据都存储在缓存中,因为有些用户具有相同的样式。您知道这方面的任何 AI 方法吗?
您能否提供任何建议来更好地构建它?
谢谢...!!!!!
底线是,对于数百万规模的问题,保存所有内容并对其进行排序可能不是一个好主意。
使用当前的数据结构, - 时间复杂度:O(n);几乎不可能减少 - space 复杂性:我们可以改进很多。例如只需要前 10 个,成本可以是 O(1)。我们只能以排序的方式保存前 10 名。在线性扫描中,我们只将新组的分数与最小的分数进行比较,如果新分数更大,则将其替换
但一个可能的问题是,如果你有太多相同分数的组,那么这可能是一个问题。你需要小心处理。
如果您以 'sorted' 的方式组织样式和组,可能会更快。 例如,按字母顺序,第 2 组将是 ['a'、'g'、'h']。我们跟踪第一个或几个字母的索引。例如,以'a'开头的群组为第一批;然后是 'b' 开头的组,依此类推。 在您的情况下,您可以通过以下方式进行搜索: 1. 首先是'a'开头的组; 2.然后搜索以'b'开头的组; 3. 然后 'f'; 4. 然后 'r'。 所以那些在 [a, b, f, r] 中没有任何样式的组不会被触及。 这样,可以为您节省很多时间。