【问题标题】:How to handle this *very* large array?如何处理这个*非常*大的数组?
【发布时间】:2021-10-19 18:22:06
【问题描述】:

我制作了一个脚本,该脚本基本上扫描指定子网中的每个 IP 以查找网络服务器中的特定网络漏洞,它工作得很好,但我遇到了一个问题,即程序消耗的内存介于 6GB 之间请求具有大量 IP 的子网,例如:127.0.0.0/8 的范围在 127.0.0.0 到 127.255.255.255 之间(我认为是 1600 万个 IP), 我在程序启动时将所有 IP 存储在一个阵列上,我认为这可能是问题所在,因为该阵列将有 1600 万个 IP...如何优化它以消耗更少的内存?

这是我当前的代码:

import gc
import requests
import ipaddress
import sys
import time
from bounded_pool_executor import BoundedProcessPoolExecutor
import urllib3
urllib3.disable_warnings()


ip_list = []
vulnerable_ip_list = []
header = { 'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36'}

if len(sys.argv) < 3:
    print("Missing argument...")
    exit()

def initialize_ip_list():
    for ip in ipaddress.IPv4Network((sys.argv[1])):
        ip_list.append(str(ip))

def initialize_threads():
    futures = []
    with BoundedProcessPoolExecutor(max_workers=int(sys.argv[2])) as executor:
        for ip in ip_list:
            executor.submit(scan_ip, ip)

def scan_ip(ip):
    host = "http://" + str(ip) + "/vulnerableurl/"
    print("Trying to fetch: " + host)
    try:
        r = requests.get(host, headers=header, verify=False, timeout=5)
        body = r.text
        if 'vulnerable page' in body.lower():
            print('Vulnerability found on: ' + host)
            with open("output.txt", "a") as txt_file:
                txt_file.write(host + "\n")
    except:
        pass

print("Initializing IPs at " + str(sys.argv[1]))
initialize_ip_list()
print("Initializing work with " + str(sys.argv[2]) + " threads")
initialize_threads()

【问题讨论】:

  • 直接遍历网络,而不是填充列表。此外,您主要是 I/O。考虑使用线程而不是进程。
  • 谢谢大家,正如@KlausD 所说,我可以通过直接在网络上迭代来优化它。 !

标签: python arrays multithreading memory


【解决方案1】:

考虑一下是否需要保留 IP 地址列表。

与其创建ip_list 对象并用initialize_ip_list() 中的IPv4Network 对象填充它,不如直接在initialize_threads() 中使用IPv4Network 对象:

def initialize_threads():
    futures = []
    with BoundedProcessPoolExecutor(max_workers=int(sys.argv[2])) as executor:
        for ip in ipaddress.IPv4Network((sys.argv[1])):
            executor.submit(scan_ip, ip)

这样它们就不会被保留 - 仅用于扫描然后丢弃。

【讨论】:

  • 非常感谢,我能够从 ~6GB 使用量增加到 ~740MB 使用量!
猜你喜欢
  • 2014-08-20
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
  • 2016-11-09
  • 2010-12-27
  • 1970-01-01
  • 2016-05-14
  • 2013-05-30
相关资源
最近更新 更多