-6ren">
gpt4 book ai didi

java - Scala 不可变 Map 慢

转载 作者:搜寻专家 更新时间:2023-11-01 02:59:43 25 4
gpt4 key购买 nike

我在创建 map 时有一段代码:

 val map = gtfLineArr(8).split(";").map(_ split "\"").collect { case Array(k, v) => (k, v) }.toMap

然后我使用这张 map 创建我的对象:

case class MyObject(val attribute1: String, val attribute2: Map[String:String]) 

我正在读取数百万行并使用迭代器转换为 MyObjects。喜欢

MyObject("1", map)

当我这样做时,它真的很慢,2'000'000 个条目需要超过 1 小时。

我从对象创建中删除了 map ,但我仍然执行拆分过程(第 1 部分):

val map = gtfLineArr(8).split(";").map(_ split "\"").collect { case Array(k, v) => (k, v) }.toMap
MyObject("1", null)

脚本运行的过程不到 1 分钟。对于 2'000'000 百万个条目。

我进行了一些分析,看起来是在创建对象时,val map 与对象映射之间的分配使过程变慢了。我缺少什么?

更新以更好地解释问题:

如果你看到我的代码来解释我的 self 迭代超过 2000000 行将每一行转换为内部对象,为了迭代我这样做:

it.map(cretateNewObject).toList

此迭代器遍历所有行并使用函数 createNewObject 将它们转换为我的对象。

这实际上非常快,特别是像 dk14 所说的使用大内存。性能问题在我里面

`crateNewObject(val line:String)` 

这个函数创建一个对象

`class MyObject(val attribute1:String, val attribute2:Map[String, String])` 

我的函数走线先做

`val attributeArr = line.split("\t")` 

数组的第一个属性记录是我对象的attribute1,第二个属性是

`val map = attributeArr(8).split(";").map(_ split "\"").collect { case Array(k, v) => (k, v) }.toMap` 

如果我只打印 map 中的元素数量,程序将在 2 分钟内结束,如果我将 map 传递到我的新对象行 MyObject(attribute1, map) 程序真的很慢。

最佳答案

(0 to 2000000).toList(0 to 2000000).map(x => x -> x).toMap 具有相似的性能足够的内存(我试过 -Xmx4G - 4 GB)。 toMap 实现有很多关于克隆,所以很多内存被“分配”/“释放”。因此,在内存不足的情况下,GC 会变得过于活跃。

当我尝试使用 128Mb 运行 (0 to 2000000).toList 时 - 它花费了几秒钟,但是 (0 to 2000000).map(x => x -> x) .toMap 在 10% 的 GC Activity (VisualVM) 下至少花费了 2 分钟,并因内存不足而终止。

但是,当我尝试 -Xmx4G 时,两者都非常快。


附言toMap 所做的是向前缀树重复添加一个元素,因此它必须为每个元素克隆 (Array.copy) 很多次:https://github.com/scala/scala/blob/99a82be91cbb85239f70508f6695c6b21fd3558c/src/library/scala/collection/immutable/HashMap.scala#L321 .

因此,toMap 重复(2000000 次)执行 updated0,这又经常执行 Array.copy,这需要大量内存分配,这(在低内存情况下)会导致 GC 在大多数时间进行 MarkAndSweep(缓慢的垃圾收集)(据我从 jconsole 中所见)。


解决方案:无论是增加内存(-Xmx/-Xms JVM 参数)还是需要对数据集进行更复杂的操作,请使用 Apache Spark(或任何面向批处理的 map-reduce 框架)以分布式方式处理您的数据。

关于java - Scala 不可变 Map 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39053215/

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