【问题标题】:Optimization for comparing every element of a list to every element in database using Django使用 Django 将列表的每个元素与数据库中的每个元素进行比较的优化
【发布时间】:2017-09-29 02:38:38
【问题描述】:

我正在 Django 1.10 中开展一个项目,我的一个应用程序要求我导入 500-100,000 个 IP 地址的列表,然后将这 500-100,000 个 IP 地址与 ~我的 SQLite3 数据库中存储了 25,000 多个 IP 地址。不幸的是,这需要相当长的时间,这是我非常需要减少的。

我的数据库包含一个 Host 表和一个名为 ipv4_address 的字段。

这里是相关的model.py:

class Host(models.Model):
    ipv4_address = models.GenericIPAddressField(protocol='ipv4', default='0.0.0.0', unique=True)

这是相关的views.py:

bad_ips = []
read_bad_ips = [ '500', 'to', '100000', 'ips', 'here', '...' ]

for ip in read_bad_ips:
    if Host.objects.filter(ipv4_address=ip).exists():
        bad_ips.append(Host.objects.get(ipv4_address=ip))

read_bad_ips 是 IP 地址列表,bad_ips 是我希望在数据库read_bad_ips 列表中都存在的 IP 列表。

从views.py优化这个sn-p代码的最佳方法是什么?

谢谢!

编辑:@nik_m 的解决方案解决了这场危机!

read_bad_ips = [ '500', 'to', '100000', 'ips', 'here', '...' ]

addresses = Host.objects.values_list('ipv4_address', flat=True)

bad_ips = list(set(read_bad_ips).intersection(addresses))

【问题讨论】:

  • read_bad_ips 是不同 IP 的列表,还是包含重复项?您可以通过消除重复项(如果它们存在并且不关心排序)来节省一些时间 (read_bad_ips = list(set(read_bad_ips))
  • @Johnny, read_bad_ips 仅具有唯一的 IP 地址。感谢您的反馈!

标签: python django sqlite django-1.10


【解决方案1】:

你可以这样做:

bad_ips = Host.objects.filter(ipv4_address__in=read_bad_ips).values_list('ipv4_address', flat=True)

这将为您提供read_bad_ips 列表中的ipv4_address 值的列表(可能是空的,也可能不是)。

[编辑]: 由于您使用的是 sqlite 数据库并且此数据库有其局限性(由于您拥有大量值),您可以尝试以下操作:

for addr in Host.objects.values_list('ipv4_address', flat=True).iterator():
    if addr in read_bad_ips:
        bad_ips.append(addr)

[编辑 2]: 尝试使用setintersection 方法,像这样:

read_bad_ips = [ '500', 'to', '100000', 'ips', 'here', '...' ]
addresses = Host.objects.values_list('ipv4_address', flat=True)

bad_ips = list(set(read_bad_ips).intersection(addresses))

【讨论】:

  • 这是我尝试的一种方式,但不幸的是它抛出了这个错误:Exception Type: OperationalError Exception Value: too many SQL variables 编辑: 这样做的原因是因为 SQLite 限制了 max 变量编号为 999 以防止过多的内存分配。
  • read_bad_ips 列表的长度大约是 500 个元素?这是一个 sqlite3 问题。你打算改变你的数据库吗?因为 sqlite 有它的局限性……
  • 我们希望在这个项目中坚持使用 SQLite。我坚持认为有人以前遇到过这样的问题,并且已经找到了某种解决方法。
  • 使用迭代器来遍历你的数据怎么样?请参阅我的(更新的)答案。
  • 刚刚尝试了您的更新答案。它可以工作,但比我原来的views.py要长3倍左右,哈哈。顺便说一句,谢谢你帮助我。
猜你喜欢
  • 2017-10-30
  • 1970-01-01
  • 2013-06-06
  • 2019-01-19
  • 2015-04-02
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
相关资源
最近更新 更多