【问题标题】:MaxMind IP Lookup Speed with Python API使用 Python API 的 MaxMind IP 查找速度
【发布时间】:2014-02-04 16:27:56
【问题描述】:

我正在构建一个脚本来处理 Web 服务器日志,并且我正在尝试将 MaxMinds 的 IP 数据集 (http://dev.maxmind.com/geoip/legacy/geolite/) 合并到脚本中,以获取命中的国家/地区。

目前,当我让脚本提取我想要的信息时,它可以正常工作,但是当我尝试添加 IP 查找时,它会减慢 - 很多 - 大约 1800%。所以,我很好奇这是否与我的代码有关,或者是否有办法可以加快速度。

例如,当我运行以下代码提取日期和 IP 地址时,对于这个实验,它大约需要 6.5 秒。

extractedData = []

for log in logList:
    ip = log[-1]
    date = log[0]
    dateIP = [date, ip]
    extractedData.append(dateIP)

当我添加 pyGeoIP 并尝试合并国家代码时,它会变慢。以下代码运行了 2 分钟 7 秒。

extractedData = []

gi = pygeoip.GeoIP('/path/to/GeoIP.dat') 

for log in logList:
    ip = log[-1]
    country = gi.country_name_by_addr(ip)
    date = log[0]
    dateCountry = [date, country]
    extractedData.append(dateCountry)

那么,有没有办法加快这个速度,因为这个查找处理速度太慢了。

谢谢!

【问题讨论】:

标签: python performance python-2.7 maxmind


【解决方案1】:

由于您正在执行许多查询,因此您应该将数据库加载到内存中。就目前而言,您正在反复从磁盘读取数据,这非常慢。

换行:

gi = pygeoip.GeoIP('/path/to/GeoIP.dat') 

到这里:

gi = pygeoip.GeoIP('/path/to/GeoIP.dat', pygeoip.MEMORY_CACHE) 

【讨论】:

  • 这将其缩短到 28 秒,如此显着的改进。
  • @cloud36 查找总是会有一些开销。如果您绝对需要更好的性能,您可能需要检查代码中的瓶颈是什么(可能通过系统性能监控)并针对它进行优化(多线程或多处理以解决 CPU 瓶颈并使用 RAID、SSD 或简单地将文件读入内存(如果是)磁盘)
  • 您还可以将C extensionlibGeoIP 一起使用,这样可以显着提高速度。也就是说,pygeoip 更 Python 且更易于使用。
【解决方案2】:

我遇到了同样的问题,但在 CentOS 机器上尝试了 Python 和 PHP。通过 Python 脚本运行 3M 的 IP 地址需要 19.5 分钟。应用 MEMORY_CACHE 优化将其缩短到 8 分钟。通过 PHP 脚本运行相同的数据需要 2-2/3 分钟。

【讨论】:

  • 您能多解释一下“MEMORY_CACHE”优化吗?
  • 如上所述:将这一行: gi = pygeoip.GeoIP('/path/to/GeoIP.dat') 改为: gi = pygeoip. GeoIP('/path/to/GeoIP.dat', pygeoip.MEMORY_CACHE)
猜你喜欢
  • 1970-01-01
  • 2015-04-28
  • 2018-12-21
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
相关资源
最近更新 更多