问题标签 [seq]
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.
f# - F# PSeq.iter 似乎并未使用所有内核
我一直在用 F# 做一些计算密集型的工作。使用 .Net Task Parallel Library 之类的函数Array.Parallel.map
以指数级的速度加快了我的代码速度,而付出的努力非常少。
但是,由于内存问题,我重新编写了一段代码,以便可以在序列表达式中懒惰地评估它(这意味着我必须存储和传递更少的信息)。当需要评估时,我使用了:
代替:
当使用任何 Array.Parallel 函数时,我可以清楚地看到我计算机上的所有内核都启动了(~100% CPU 使用率)。然而,所需的额外内存意味着程序永远不会完成。
当我运行程序时使用 PSeq.iter 版本,CPU 使用率只有 8% 左右(并且 RAM 使用率最低)。
那么:PSeq 版本运行这么慢有什么原因吗?是因为懒惰的评价吗?我缺少一些神奇的“平行”的东西吗?
谢谢,
其他资源,两者的源代码实现(它们似乎在 .NET 中使用不同的并行库):
https://github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Core/array.fs
https://github.com/fsharp/powerpack/blob/master/src/FSharp.PowerPack.Parallel.Seq/pseq.fs
编辑:为代码示例和详细信息添加了更多详细信息
代码:
序列
/li>大批
/li>
细节:
- 存储中间数组版本在 10 分钟内快速运行(就崩溃前而言),但在崩溃之前使用 ~70GB RAM(64GB 物理,其余分页)
- seq 版本需要 34 分钟并使用一小部分 RAM(仅约 30GB)
- 我正在计算一个〜十亿的价值。因此,十亿双倍(每个 64 位)= 7.4505806GB。有更复杂的数据形式......我正在清理一些不必要的副本,因此当前大量的 RAM 使用。
- 是的,架构不是很好,懒惰的评估是我尝试优化程序和/或将数据分成更小的块的第一部分
- 使用较小的数据集,两个代码块输出相同的结果。
- @pad,我尝试了你的建议,当输入 Calculation[] 时,PSeq.iter 似乎工作正常(所有内核都处于活动状态),但仍然存在 RAM 问题(它最终崩溃了)
- 代码的摘要部分和计算部分都是 CPU 密集型的(主要是因为大数据集)
- 使用 Seq 版本,我的目标只是并行化一次
scala - 当 match 收到 IndexedSeq 但不是 LinearSeq 时出现 MatchError
有没有理由match
写反对在类型上的Seq
工作方式与在类型上的工作方式不同?对我来说,无论输入类型如何,下面的代码似乎都应该做同样的事情。当然不会,否则我不会问。IndexedSeq
LinearSeq
在 2.9.1 final 上运行它,我得到以下输出:
它对于 List-y 的东西运行良好,但对于 Vector-y 的东西却失败了。我错过了什么吗?这是编译器错误吗?
的scalac -print
输出m
看起来像:
scala - 使用每个 Tuple 的一个元素过滤 Tuple3 的 Seq
我有一个Seq
元素Tuple3
。我想要一个由每个元组的第二个元素组成的结果集合(可能是 a Set
) 。
例如
任何的想法?我搜索了很多,但我发现的所有内容都与过滤元组有关,而不是在它们内部,如果这有任何意义的话。
我对 Scala 还是很陌生,学习是一个漫长的过程 :) 感谢您的帮助。
scala - Scala 将 Seq 转换为 sbt.Project.Setting[_] 的 k, v
Play 2.0 的 Build.sbt 使用拉皮条的项目定义来发挥它的魔力;您可能需要添加的任何其他设置必须以k := v
时尚的方式手动输入。适用于一般情况,但不适用于特定情况;也就是说,当需要设置一个 sbt-plugin 的设置时,它总是Seq[Settings[_]]
. 这是一个可以预见的工作示例
现在,如何将 Seq[Settings[_]] 转换为 k,v 对,因此 Play by-name 调用:
真的有效吗?!!
我已经询问过游戏用户,但祝你好运,那里有一个动物园,框架正在起飞,核心开发人员显然已经在他们的耳朵里......
r - 用最少的代码打印一个乘法表
在 R 中,打印乘法表的最快方法(最短代码)是什么?seq rep 和 bind 函数有帮助,但我正在寻找最短的代码行来执行此操作。
打印 1 到 6 穿过(水平)。任何人都知道如何以更紧凑的方式执行此操作?
list - Scala 中 Seq 和 List 的区别
我在许多示例中看到,有时使用 Seq,而其他时候使用 List ...
除了前者是 Scala 类型和 List 来自 Java 之外,有什么区别吗?
performance - 为什么 Seq.iter 和 Seq.map 这么慢?
考虑 F# 中的这段代码:
为什么模块上的iter
andmap
函数比和模块等效的函数Seq
慢得多?Array
List
map - 从两个或多个序列创建地图序列
我是 Clojure 的新手,我想知道是否有办法从两个或多个序列创建一系列映射。
假设您有:
如果你合并了这些,我想得到 Ruby 中的哈希数组,或者 Clojure 中的一系列映射?
谢谢!
haskell - Haskell:使用 deepseq 进行更严格的折叠
页面Foldr Foldl Foldl'讨论foldl'
,并将其定义为:
这样做是为了避免空间泄漏,即fold'
产生恒定大小的结果仅使用恒定空间。
然而,这并不一定有效,正如这里所指出的:
所涉及的
seq
函数只评估最顶层的构造函数。如果累加器是一个更复杂的对象,那么fold'
仍然会建立未评估的 thunk。
显而易见的解决方案是更改seq
为deepseq
如图所示(假设您正在使用NFData
):
deepseq
但我有一种感觉,这可能非常低效,因为每次通过循环都需要遍历整个结构(除非编译器可以静态证明这不是必需的)。
然后我尝试了这个:
但是发现它有这个问题。当它应该返回 3 时,下面会失败。
所以fold_stricter
太严格了。该列表不必严格,防止空间泄漏的重要一点是累加器是严格的。fold_stricter
走得太远并且也使列表变得严格,这导致上述失败。
这让我们回到fold_strict
. deepseq
在一个大小的数据结构上重复运行n
需要O(n)
时间,还是O(n)
第一次和O(1)
之后只需要时间?(正如dbaupp在下面的评论中建议的那样)
haskell - Haskell thunk 在评估方面是否可变?
在研究并行编程以及随后的评估策略时,出现了 thunk 是否可变的问题。举个例子,假设我有以下代码:
seq
在评估bar
评估时调用foo
,给出bar
正常形式的值3
。这个评价也有影响foo
吗?也就是说,是foo
仍然1+2
还是3
经过评估后的价值bar
?