问题标签 [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.
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 语句即可完成这项工作。
我不清楚文档在哪里表明了这一点。
multithreading - 使用 rusoto 的 rust AWS 分段上传,多线程(人造丝)在“没有反应堆运行......”时惊慌失措
我正在尝试将文件上传到aws
in rust
,因为我正在使用 s3 rust 客户端,当这些部分是从单个rusoto_s3
线程发送时,我设法让多部分上传代码工作,但是,这不是我想要的,我想上传大文件,我希望能够在多个线程中发送这些部分,为此,我做了一点谷歌搜索,我遇到了rayon。
有关信息,分段上传的工作方式如下:
- 启动多部分 -> aws 将返回一个 ID
- 使用这个ID发送不同的part,传递文件chunk,part number -> aws会返回一个
Etag
- 发送所有部分后,发送一个完整的上传请求,其中包含所有已完成的部分,因为数组包含
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很重要,那么它们是:
生锈的新手,所以有很多移动部件可以让这个正确!
rust - 如何将 ParallelIterator 转换回顺序迭代器?
我正在从数据库中迭代数 GB 的输入项。在每个输入项上,我都在进行一些 CPU 密集型处理,这会产生一个或多个新的输出项,总共有几十 GB。然后将输出项存储在另一个数据库表中。
通过使用 Rayon 进行并行处理,我得到了很好的加速。但是,数据库 API 不是线程安全的;it's Send
but not Sync
,所以 I/O 必须被序列化。
理想情况下,我只想写:
基本上我想要相反的par_bridge()
; 在调用它的线程上运行的东西,从每个线程中读取项目,并按顺序生成它们。但在当前的 Rayon 实现中,这似乎不存在。我不确定这是否是因为它在理论上是不可能的,或者它是否不适合图书馆的当前设计。
输出太大,无法将其全部收集到Vec
第一个;它需要直接流式传输到数据库中。
顺便说一句,我没有嫁给Rayon;如果有另一个更合适的板条箱,我很乐意进行转换。
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 的方法,或者更合适的并行计算方法来解决这个问题?
rust - 访问 par_iter_mut 内集合中不同索引的字段
以下示例说明了我正在尝试做的事情:
以上不会编译。问题是,我无法在第一个 for_each 的关闭中访问 &self.children。我确实明白,为什么借用检查器不允许这样做,所以我的问题是,是否有办法让它在很少改变的情况下工作。到目前为止我找到的解决方案并不令人满意。一种解决方案是在 Parent::calculate 距离的开头克隆孩子并在闭包内使用它(这会添加不必要的克隆)。另一种解决方案是像这样提取 Child 的 value 字段:
虽然这会很有效,但它完全弄乱了我的真实代码,并且价值在概念上真的属于 Child。我对 rust 比较陌生,只是问自己是否有任何好的方法可以做到这一点。据我了解,需要一种方法来告诉编译器,我只更改并行迭代器中的距离字段,而值字段保持不变。也许这是一个使用不安全的地方?无论如何,如果你能提示我正确的方向,我将非常感激,或者至少确认我的代码真的必须变得更加混乱才能使它工作:)
rust - 为什么 filter() 对并行迭代器有不同的类型要求?
我试图理解为什么 Rayon 的filter()
函数不需要指定正确的类型就无法工作,而filter()
如果我不使用并行迭代器则可以正常工作。这是我的代码:
以下是错误消息:
filter()
如果我不使用,为什么只在不指定整数类型的情况下工作into_par_iter()
?(我知道我可以通过将范围标记为 i64 来修复它,但不是为什么它是必要的)
rust - 当我只需要访问结构的一个成员时迭代结构向量
我有一个结构向量。它被称为更新,我想通过减少结构来减少这个向量以获得最大波速。我试图减少使用人造丝库中的 par_iter() 。由于身份 (id) 和运算符 (op) 函数的输入和输出类型不同,我的代码无法编译。有没有办法让迭代器只看到 max_wavespeed 字段,还是我必须返回一个包含降低的波速的更新结构?
我对这段代码的错误:
我想要的是:知道我是否可以遍历 Updates 结构的成员,还是必须返回 Upates 结构。
rust - 专用人造丝池提交工作并异步等待完成
我有一个rayon::ThreadPool
我想用它在 Tokio 的运行时上下文之外执行 CPU 绑定任务。CPU 绑定任务是同步任务。
问题是spawn
需要关闭,'static
但我想使用借来的数据而不是制作拥有的副本。
最初我认为scope
会起作用(并且代码也可以编译),但它似乎会阻塞直到关闭完成 - 这将破坏我使用这个池的目的,即不阻塞 tokio 运行时。
如何使用人造丝或任何其他线程池实现来实现这一点?
rust - Rayon 的并行迭代器与 Rust 中的 ureq 阻塞 HTTP 之间的交互是什么?
如果我有 100 个 url 的 vec 并制作并行迭代器,它会产生 100 个阻塞的 HTTP 请求,那么第一个请求会阻塞其余的请求,还是可以在其中一些完成之前完成所有请求?