在Djang中计算大型数据集

2024-06-02 09:23:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在生成一个项目之间相似性的矩阵,以便将其提供给Django中的推荐系统。(一天结束时是n^2。)

我遇到的问题是,无论我是否使用iterator(),我的内存仍然会被吸住。 我会这样做:

rated_apps_list = Rating.objects.values_list('item_id', flat=True).order_by('-item_id').distinct()
rated_apps_iter = MemorySavingQuerysetIterator(rated_apps_list[start:])

for app_above in rated_apps_iter:
    rated_apps_below_iter = MemorySavingQuerysetIterator(rated_apps_list[i+1:])
    for app_below in rated_apps_below_iter:
        ...

其中MemorySavingQuerySetIterator为:

^{pr2}$

起初我只尝试使用.iterator()函数,但后来我相信是数据库客户端缓存了结果。 漏洞仍然存在,过了一段时间我必须重新加载脚本。在

我知道创建和元素一样多的迭代器看起来效率不高,因为那样的话,我会把所有的元素都放在内存中,你们会怎么做呢?。在

有什么想法吗?谢谢!在


Tags: apps内存inidapp元素forrated
1条回答
网友
1楼 · 发布于 2024-06-02 09:23:05

实际上,你的解决方案几乎可以。建议很少:

  1. 不要deepcopyqueryset,它是在切片时克隆的。在
  2. 从数据库的角度来看,切片是低效的(sql中的大偏移量),这意味着数据库需要准备许多行,然后只传递给您很少的行。在
  3. 如果可以在中间的表中添加或删除任何内容,则切片也是不安全的。在

您可以根据您的情况调整this thing。只需使用item_id而不是pk。它使用条件而不是偏移,因此效率更高。在

相关问题 更多 >