如何有效地将一个巨大的参数传递给一个函数?

How to pass efficiently a huge sized parameter to a function?

感谢阅读。请原谅我的英语,我是法语。 这是理由吗?

我的功能的目的是通过 multiprocessing/threading 扫描许多 IPv4:PORT(不要,我预见你,做not !) in Python3,发送 SYN 并注册任何结果。 Multisomething 在这里被调用是因为等待任何潜在的回复需要超时。 所以。

此函数称为 生产者。它将潜在的 TCP 连接存储到数据库中。 消费者 然后读取数据库并独立进行一些渗透测试。所以。

我准备了一个 IPv4 列表。它是 10 位 K 元素的随机有效 IP 列表。请记住,我们有 65K 个端口要测试每个 IPv4。

然后我的方法是为每个启动的生产者用一个新的种子来打乱列表端口。我有许多。每个都有一个有效的 IPv4 列表,但是,如果我们考虑具有 100K IP 的 65K 端口,我们有 6.5G 元素要传递。

为什么?

IP[]random.shuffle()-likePorts[] 也是。

如果我读取 p in Ports 并且对于每个 p,加入 IPv4:Ports 并附加到 params[],我可以启动 并行化 通过 scan(u) for u in params[]

工作

我像这样通过 run(rounds) 启动它:

def run(rounds):
   for r in rounds:
      scan(r)

但是,问题是size(rounds) = size(params) ~ 6.5G个元素

我找不到有效的(内存说话)方法来将这么大的参数(大列表)传递给并行作业。我 运行 内存不足。

我不是在问如何在功能强大的工作站上管理它,虽然在纸上设计了这个功能,但它不适合 raspi2 (1GB 内存).

我自己根本不需要Python3,它是一个教学产品。因此,我被卡住了。

我的问题是:你能帮我找到一种有效的方法来攻击一个巨大的列表吗?

我用谷歌搜索,关注了我知道的论坛和主题,但是,当我重构程序时,不断出现的问题仍然存在,嘲笑我,在 main().

我不想重现的内容:

MAX_IPV4 = i.IPv4Address._ALL_ONES
MAX_PORT = 65535

def r_ipv4():
    while True:
        a=i.IPv4Address._string_from_ip_int(r.randint(0, MAX_IPV4))
        b=i.IPv4Address(a)
        if b.is_multicast or b.is_private or b.is_loopback or b.is_reserved or b.is_link_local :
            continue
        else :
            return a
            break

def generate_target():
    return r_ipv4()

def generate_r_targets(n):
    ip=[]
    for i in range(0,n):
            ip.append(generate_target())
    ports=[]
    for p in range(1,65535):                                                                         
            ports.append(p)
    r.shuffle(ports)
    targets=[]
    for p in ports:
        for z in ip:
            targets.append((str(z)+","+str(p)))

这不是我的最佳方法,但我最多可以解释和展示问题的方式。

我不想丢失(洗牌的端口)可迭代对象,它是我的主要向量,它位于核心位置。 我正在测试 knockd 的动态配置。

说。 Computer_one 在 knockd 中注册一个序列。 Computer_one是唯一知道种子的人。 seed是knockd的key序列的key,搞定。

我们通过普通文件传递它:)