当前位置: 首页 > 知识库问答 >
问题:

如何快速获得基于该模型上的权重字段的Django模型实例的加权随机实例?

卫建义
2023-03-14

我使用Postgres作为数据库后端,但我认为这无关紧要。此外,我仍然希望使用sqlite3作为本地开发数据库,因此理想情况下,任何方法都可以同时适用于这两种数据库。

我所说的"加权"是指数据库表中的某些项目比其他项目更有可能出现,这是基于从0inf的启发式值,其中0是"永远不会被选中",1是"与任何其他实例一样可以被选中",而2是"被选中的可能性是任何其他实例的两倍"。

我读过其他一些关于随机抽取模型实例的帖子,但就我所见,没有方法可以快速完成这项工作,包括权重。

我的模型:

  • 有数百万个实例。
  • 有一个权重DecimalField,可以随时更新,甚至在运行时。
  • 除了使用这种随机选择算法之外,不会在任何地方被引用(例如,它可以在任何时候被删除和重新创建,没有任何问题)。

我想要的是一种比我尝试过的解决方案更快的快速方法,或者解释为什么我尝试过的一种解决方案是我能得到的最快的。

我想从数据库表格中选择“新鲜”的内容,但仍然有机会看到一些较旧的内容。如果一些内容被浏览得太频繁或不太受欢迎,它应该出现得更少。理想情况下,我可以控制这一频率:“啊,所以这将是网站上其他内容的1.5倍。”

  • 计算模型的实例总数。例如:100

这似乎相当缓慢,“回退”的随机性可能永远不会终止。总的来说,这真的很简陋,我不想用它。把它放在第一位,因为它相当“简单”,我很可能会忽略它。

  • 选择所有行
  • 根据权重为每行分配一系列ID
  • 将所有权重动态相加
  • 掷一个所有权重之和的骰子
  • 无论选择什么,根据权重选择一个ID

问题是,这种算法对于数百万行来说似乎很慢。这是“天真”的解决方案。

  • 每当添加了某些内容或更改了权重时,删除所有包含实例的唯一详细信息的实例,并创建具有相同元信息的权重更多实例。
  • 通常选择一个随机实例。

需要注意的是,只有基于整数的权重是可能的。选择代码 操作时,代码也会被删除。

  • 添加一个抛出概率字段,而不是权重

这最终解决了问题,但仍然可能需要更多的数据库调用,这是一种间接的解决方案。

正是如此,所以我确信有一些聪明的基于注释的解决方案(或类似的解决方案)是我忽略的。提前谢谢你的帮助!


共有1个答案

巫马俊力
2023-03-14

您可以将切分与您列出的任何方法相结合。选择多个碎片(最好是行数/碎片数明显大于log(行数),以避免高概率出现空碎片),为每一行分配一个统一的随机碎片ID,并将碎片ID作为主键的第一个条目,以便表按碎片排序。要进行采样,请选择一个均匀的随机碎片,然后在碎片内进行采样。这是不准确的,因为碎片总数是不平衡的,但如果碎片足够大,那么大数定律就会生效。(不过,如果碎片太大,那就开始破坏碎片分割的意义。)

 类似资料:
  • 问题内容: 我有一个模型,希望包含一个主题名称及其首字母。(数据在某种程度上是匿名的,并且通过缩写来跟踪。) 现在,我写了 如最后一行所示,我希望能够将姓名的首字母实际作为字段(与名称无关)存储在数据库中,但是会使用基于名称字段的默认值进行初始化。但是,我遇到了问题,因为Django模型似乎没有“自我”。 如果将行更改为,则可以执行syncdb,但不能创建新主题。 在django中,有一个可调用函

  • 业务场景: 同一个登陆页面,管理员和普通用户有不同的用户名和登录密码。登陆之后需要进入不同的home页面,以此类推,导航栏也完全不同。所有UI和功能都不同。也就是说同一套代码,登陆的之后却是不同的网络应用。 问题: 这种设计在开发中会不会有什么不便的地方。比如:这一个代码库跑在localhost:3000上面,那么存储的token也在这个3000 localStorage下面,如果我想要同时开发“

  • 我已经看到了创建Django用户模型实例的不同方法。它遵循了Django开发中的最佳实践 1. 2.

  • 问题内容: 给定Django模型,我试图列出其所有字段。我已经看到了使用_meta模型属性执行此操作的一些示例,但是meta前面的下划线是否表示_meta属性是私有属性,不应直接访问?…例如,因为_meta的布局将来可能会更改,并且不是稳定的API? _meta是该规则的例外吗?它是否稳定且可以使用,还是访问它的不正确做法?还是有一种功能或其他方法可以在不使用_meta属性的情况下自省模型的字段?

  • 如何知道django模型的一个实例何时在sqlite中创建了?我尝试了许多方法,但是我不知道或不知道我的数据库实例是何时创建的 从datetime导入datetime,time delta time _ threshold = datetime . now()-time delta(hours = 4)results = x . objects . filter(created _ _ lt =

  • 问题内容: 允许从向量中进行加权选择,即 选择概率为0.2的1,概率为0.5的2和概率为0.3的3。 如果我们想对每个行都是概率向量的2D数组(矩阵)以向量化的方式快速进行操作,该怎么办?也就是说,我们想要一个来自随机矩阵的选择向量吗?这是超级慢的方式: : 这篇文章表明,并且可能是一种潜在的方法,而且很快。但是虽然可以沿numpy数组的一个轴执行此操作,但是该函数一次只能在单个数组上运行。同样,