我正在尝试计算从 0 开始到文件长度(62977)的元组中所有可能的对组合,因此我将此结果作为单个 DASK 系列\数据帧得到,没有重复:
(0,1), (0,2), (0,3) ...(0,62976),(1,2), (1,3), ... (62975,62976)
如何在不出现内存错误的情况下执行此操作?
请帮忙,我没有更多解决方案:(
不确定您想在这里实现什么(或者为什么这必须是 DASK 系列)...
如果您打算迭代列表,itertools.combinations可能就是您正在寻找的
它将返回一个生成器,因此不会出现内存问题,但请注意,可能有很多组合......(准确地说是 1982956800)
from itertools import combinations
x = range(62976)
combs = combinations(x, 2)
for c in combs:
....
当然有可能!我也无法想象你为什么想要这样做,但你来了......
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})
)