gpt4 book ai didi

query-performance - 如何使用 SQLAlchemy 和 PostgreSQL 对大表中的所有行进行有效排序?

转载 作者:太空宇宙 更新时间:2023-11-03 14:49:35 27 4
gpt4 key购买 nike

我正在构建一个推荐系统。我有下表存储每个项目的功能:

class Item_feature(db.Model):
__tablename__ = "Item_feature"
item_id = db.Column(db.Integer, primary_key=True)
feature_id = db.Column(db.Integer, primary_key=True)
weight = db.Column(db.Integer)

我不需要创建 Item 表,因为唯一重要的信息是它们的 ID(除了功能之外)。这就解释了为什么 item_id 键不是外键。

每个项目可能有 40 个功能。因此,如果推荐器有 200k 个项目,则将有数百万行。我需要将项目保留在内存中,以避免在必须提出建议时获取它们。我没有找到更好的表示来存储这些功能,因此这方面的想法也非常有用。

初始化系统时我需要获取所有项目的所有功能。如果项目未按 item_id 排序(或至少按 item_id 分组),我将必须在功能列表的每个循环中查找具有相同 item_id 的项目。

我将此查询与 SQLAlchemy 结合使用来获取功能:

features = model.Item_feature.query.all().order_by(model.Item_feature.item_id)

但这可能真的很慢。使用以下内容:

features = model.Item_feature.query.all()

不保证结果会被排序。这似乎取决于添加到数据库的顺序。

如果功能被分组或排序,我可以使用单个循环做一些更有效的事情,例如:

item = None
item_id = None
for f in features:
# Adds features to item until item_id changes
if item_id != f.item_id:
item_id = f.item_id
item = Item(item_id)
self.items[item_id] = item # Adding new item to the dictionary of items
item.new_feature()

如代码所示,我使用字典来存储项目。我不太确定这是否是一个好的选择。

那么,考虑到可能存在的大量行,如何以有效的方式按第一个主键 user_id 分组(或排序)行?

最佳答案

So, how could I get the rows grouped (or sorted) by the first primary key user_id in an efficient way considering the possible huge amount of rows?

为了存储机器学习权重,我会尝试“NoSQL 解决方案”(甚至在 PostgreSQL 或文件上),因为逐行处理数百万个权重是不切实际的。

这个想法是,当机器学习完成训练/再训练时,以相同的精确格式(结构、排序、分组等)存储您的权重,您需要将它们读入以便在应用程序中使用预测/建议。

这可以分摊将数据重组到训练阶段一次性写入的成本,并避免在您所说的“系统初始化”时重组数据。

PostgreSQL 的 JSONB 字段可以容纳 1GB 的数据。您可以保存字典和列表,这样您就可以保留使用 Python 代码片段计算的结构。

或者,如果您还想避免将权重反序列化为模型使用的格式,您可以将其存储为 binary blob .

否则,以相同格式将权重存储在文件中也可以。

关于query-performance - 如何使用 SQLAlchemy 和 PostgreSQL 对大表中的所有行进行有效排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45975260/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com