gpt4 book ai didi

memory - Rust-使用Rayon进行排列-矢量内存分配错误

转载 作者:行者123 更新时间:2023-12-03 11:43:47 24 4
gpt4 key购买 nike

目标:生成数十亿个排列,并在每个排列上并行运行代码。
尝试:使用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));
}
data输入向量为16个元素或更少时,代码运行。对于24个元素,将返回以下错误: memory allocation of 121898649600 bytes failed error: process didn't exit successfully: target\debug\threads.exe (exit code: 0xc0000409, STATUS_STACK_BUFFER_OVERRUN)不使用人造丝 crate 可处理24个元素,但速度很慢-此代码将最后两行替换为: data.into_iter().permutations(k).for_each(move |x| further_processing(x));因此,问题似乎在于为 rayon随后可以访问的非常大的,不断增长的置换向量分配内存。
有没有一种方法可以成功地生成供人造丝访问的非常大的排列集,或者直接在输入数据上使用人造丝的更智能的方法,或者是针对此问题的更合适的并行计算方法?

最佳答案

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

use rayon::iter::ParallelIterator;
use rayon::iter::ParallelBridge;
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 data_iter = data.into_iter().permutations(k);

data_iter.par_bridge().for_each(move |x| further_processing(x));
}

关于memory - Rust-使用Rayon进行排列-矢量内存分配错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66567587/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com