问题标签 [rayon]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
154 浏览

rust - 如何在 Rayon 并行迭代器中使用 hashbrown 数据类型?

我有一个hashbrown::HashSet,我正在尝试使用 Rayon's par_iter,但我无法找出正确的语法。

货运.toml

src/main.rs

这无法编译。

hashset -rayon 文档建议hashbrown::hash_set::rayon具有与 Rayon 相关的数据类型,我知道有时我需要使用特征来使功能可用。但是,如果我取消注释导入,它甚至找不到模块:

我在 Mac 上运行 Rust 1.49.0:

问题是什么?

编辑

正如策展人@E_net4 在评论中指出的那样,人造丝支持是一项功能。将依赖项更改为

无需额外的 use 语句即可完成这项工作。

我不清楚文档在哪里表明了这一点。

0 投票
1 回答
466 浏览

multithreading - 使用 rusoto 的 rust AWS 分段上传,多线程(人造丝)在“没有反应堆运行......”时惊慌失措

我正在尝试将文件上传到awsin rust,因为我正在使用 s3 rust 客户端,当这些部分是从单个rusoto_s3线程发送时,我设法让多部分上传代码工作,但是,这不是我想要的,我想上传大文件,我希望能够在多个线程中发送这些部分,为此,我做了一点谷歌搜索,我遇到了rayon

有关信息,分段上传的工作方式如下:

  1. 启动多部分 -> aws 将返回一个 ID
  2. 使用这个ID发送不同的part,传递文件chunk,part number -> aws会返回一个Etag
  3. 发送所有部分后,发送一个完整的上传请求,其中包含所有已完成的部分,因为数组包含Etag和 部分编号。

我是 rust 新手,来自 C++ 和 Java 背景,这是我的代码:

这是我得到的输出和错误示例:

我用谷歌搜索了这个错误,但我并不清楚它的实际含义:

这是我发现的: another question with the same error

还有一个问题

这似乎是一些兼容性问题,因为 s3 可能使用的某些版本tokio与我拥有的 tokio 版本不兼容。

以下是一些相关的依赖项:

我认为主要问题在于实际上想要在线程中运行async代码。rayon我尝试async使用 将我的代码更改为阻塞代码executor::block_on,我还花了一些时间试图让编译器满意,我有多个线程都想写入,let completed_parts = Arc::new(Mutex::new(vec![]));所以我在这里做了一些克隆以使编译器满意。

另外,如果我用过的craes很重要,那么它们是:

生锈的新手,所以有很多移动部件可以让这个正确!

0 投票
2 回答
130 浏览

rust - 如何将 ParallelIterator 转换回顺序迭代器?

我正在从数据库中迭代数 GB 的输入项。在每个输入项上,我都在进行一些 CPU 密集型处理,这会产生一个或多个新的输出项,总共有几十 GB。然后将输出项存储在另一个数据库表中。

通过使用 Rayon 进行并行处理,我得到了很好的加速。但是,数据库 API 不是线程安全的;it's Sendbut not Sync,所以 I/O 必须被序列化。

理想情况下,我只想写:

基本上我想要相反的par_bridge(); 在调用它的线程上运行的东西,从每个线程中读取项目,并按顺序生成它们。但在当前的 Rayon 实现中,这似乎不存在。我不确定这是否是因为它在理论上是不可能的,或者它是否不适合图书馆的当前设计。

输出太大,无法将其全部收集到Vec第一个;它需要直接流式传输到数据库中。

顺便说一句,我没有嫁给Rayon;如果有另一个更合适的板条箱,我很乐意进行转换。

0 投票
1 回答
170 浏览

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

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

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

最小可重现代码:

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)

不使用 rayon crate 可以处理 24 个元素,但速度很慢 - 此代码将最后两行替换为:data.into_iter().permutations(k).for_each(move |x| further_processing(x));

所以问题似乎是为一个非常大的、不断增长的排列向量分配内存,rayon然后可以访问。

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

0 投票
1 回答
98 浏览

rust - 访问 par_iter_mut 内集合中不同索引的字段

以下示例说明了我正在尝试做的事情:

以上不会编译。问题是,我无法在第一个 for_each 的关闭中访问 &self.children。我确实明白,为什么借用检查器不允许这样做,所以我的问题是,是否有办法让它在很少改变的情况下工作。到目前为止我找到的解决方案并不令人满意。一种解决方案是在 Parent::calculate 距离的开头克隆孩子并在闭包内使用它(这会添加不必要的克隆)。另一种解决方案是像这样提取 Child 的 value 字段:

虽然这会很有效,但它完全弄乱了我的真实代码,并且价值在概念上真的属于 Child。我对 rust 比较陌生,只是问自己是否有任何好的方法可以做到这一点。据我了解,需要一种方法来告诉编译器,我只更改并行迭代器中的距离字段,而值字段保持不变。也许这是一个使用不安全的地方?无论如何,如果你能提示我正确的方向,我将非常感激,或者至少确认我的代码真的必须变得更加混乱才能使它工作:)

0 投票
1 回答
151 浏览

rust - 为什么 filter() 对并行迭代器有不同的类型要求?

我试图理解为什么 Rayon 的filter()函数不需要指定正确的类型就无法工作,而filter()如果我不使用并行迭代器则可以正常工作。这是我的代码:

以下是错误消息:

filter()如果我不使用,为什么只在不指定整数类型的情况下工作into_par_iter()?(我知道我可以通过将范围标记为 i64 来修复它,但不是为什么它是必要的)

0 投票
1 回答
251 浏览

multithreading - 如何以线程安全的方式使用 Rayon 的 par_iter 读取和修改变量?

这段代码:

产生错误:

0 投票
1 回答
187 浏览

rust - 当我只需要访问结构的一个成员时迭代结构向量

我有一个结构向量。它被称为更新,我想通过减少结构来减少这个向量以获得最大波速。我试图减少使用人造丝库中的 par_iter() 。由于身份 (id) 和运算符 (op) 函数的输入和输出类型不同,我的代码无法编译。有没有办法让迭代器只看到 max_wavespeed 字段,还是我必须返回一个包含降低的波速的更新结构?

我对这段代码的错误:

我想要的是:知道我是否可以遍历 Updates 结构的成员,还是必须返回 Upates 结构。

0 投票
0 回答
286 浏览

rust - 专用人造丝池提交工作并异步等待完成

我有一个rayon::ThreadPool我想用它在 Tokio 的运行时上下文之外执行 CPU 绑定任务。CPU 绑定任务是同步任务。

问题是spawn需要关闭,'static但我想使用借来的数据而不是制作拥有的副本。

最初我认为scope会起作用(并且代码也可以编译),但它似乎会阻塞直到关闭完成 - 这将破坏我使用这个池的目的,即不阻塞 tokio 运行时。

如何使用人造丝或任何其他线程池实现来实现这一点?

操场

0 投票
1 回答
62 浏览

rust - Rayon 的并行迭代器与 Rust 中的 ureq 阻塞 HTTP 之间的交互是什么?

如果我有 100 个 url 的 vec 并制作并行迭代器,它会产生 100 个阻塞的 HTTP 请求,那么第一个请求会阻塞其余的请求,还是可以在其中一些完成之前完成所有请求?