python计算大n的两个元组

问题描述 投票:0回答:2

我正在尝试计算从 0 开始到文件长度(62977)的元组中所有可能的对组合,因此我将此结果作为单个 DASK 系列\数据帧得到,没有重复:

(0,1), (0,2), (0,3) ...(0,62976),(1,2), (1,3), ... (62975,62976)

如何在不出现内存错误的情况下执行此操作?

请帮忙,我没有更多解决方案:(

python pandas tuples combinations dask
2个回答
0
投票

不确定您想在这里实现什么(或者为什么这必须是 DASK 系列)...
如果您打算迭代列表,itertools.combinations可能就是您正在寻找的

它将返回一个生成器,因此不会出现内存问题,但请注意,可能有很多组合......(准确地说是 1982956800)

from itertools import combinations

x = range(62976)
combs = combinations(x, 2)

for c in combs:
    ....

0
投票

当然有可能!我也无法想象你为什么想要这样做,但你来了......

def part(range1, range2):
    import pandas as pd
    return pd.Series(itertools.product(range1, range2))

range1gen = (range(i, min(i+ 100, 62977)) for i in range(0, 62977, 100))
range2gen = (range(0, 62977) for i in range(0, 62977, 100))
ser = dask.dataframe.from_map(part, range1gen, range2gen)

这会产生 630 个惰性分区,6297700 行或每个约 100MB,第一个

>>> df.partitions[0].compute()
0               (0, 0)
1               (0, 1)
2               (0, 2)
3               (0, 3)
4               (0, 4)
              ...
6297695    (99, 62972)
6297696    (99, 62973)
6297697    (99, 62974)
6297698    (99, 62975)
6297699    (99, 62976)

(您需要设置配置以将它们获取为元组而不是字符串:

dask.config.set({"dataframe.convert-string":  False})

© www.soinside.com 2019 - 2024. All rights reserved.