Memory Rust-使用人造丝进行排列-向量内存分配错误

Memory Rust-使用人造丝进行排列-向量内存分配错误,memory,rust,permutation,large-data,rayon,Memory,Rust,Permutation,Large Data,Rayon,目标:生成数十亿个排列,并在每个排列上并行运行代码 尝试:使用Itertools将所有排列分配给结果向量,然后使用人造丝处理每个排列 最小可复制代码: use rayon::iter::ParallelIterator; use rayon::iter::IntoParallelIterator; use itertools::Itertools; fn main() { let data: Vec<u128> = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9

目标:生成数十亿个排列,并在每个排列上并行运行代码

尝试:使用Itertools将所有排列分配给结果向量,然后使用人造丝处理每个排列

最小可复制代码:

use rayon::iter::ParallelIterator;
use rayon::iter::IntoParallelIterator;
use itertools::Itertools;

fn main() {
    let data: Vec<u128> = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19].to_vec();
    let k = 8;
    let vector: Vec<Vec<u128>>

    //Following code should return 29.6 billion permutations
    let _vector = data.into_iter().permutations(k).map_into::<Vec<u128>> 
    ().collect_vec();

    //Following code then processes each permutation using rayon crate
    (vector).into_par_iter().for_each(move |x| further_processing(x));
}
使用rayon::iter::ParallelIterator;
使用rayon::iter::into并行迭代器;
使用itertools::itertools;
fn main(){
让数据:Vec=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19];
设k=8;
让向量:Vec
//下面的代码应该返回296亿个排列
设_vector=data.into_iter().permutations(k).map_into::
()收集_vec();
//接下来的代码使用人造丝板条箱处理每个排列
(向量)。进入到每一个(移动| x |进一步|处理(x));
}
数据
输入向量小于等于16个元素时,代码运行。对于24个元素,以下错误返回:
内存分配121898649600字节失败错误:进程未成功退出:target\debug\threads.exe(退出代码:0xc0000409,状态\堆栈\缓冲区\溢出)

不使用人造丝板条箱可以处理24个元素,但速度非常慢-此代码将最后两行替换为:
data.into_iter().permutations(k)。对于每个元素(移动| x |进一步处理(x))

因此,问题似乎是一个非常大的、不断增长的排列向量的内存分配,
rayon
可以访问它


有没有一种方法可以成功地生成这个非常大的排列集供人造丝访问,有没有一种更聪明的方法可以直接在输入数据上使用人造丝,或者有更合适的并行计算方法来解决这个问题?

我似乎找不到任何并行排列实现,因此,您最好的选择可能是将迭代器转换为并行迭代器。请注意,除非您的处理是密集型的,否则您不应该使用此方法,而应该使用常规迭代器方法,因为这会增加同步成本

使用rayon::iter::ParallelIterator;
使用人造丝::iter::平行桥;
使用itertools::itertools;
fn main(){
让数据:Vec=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19];
设k=8;
设data_iter=data.into_iter().置换(k);
每个(移动| x |进一步|处理(x))的数据_iter.par_bridge();
}

非常感谢您的见解@Aplet123,非常感谢。