我想知道是否有可能利用scala-native执行大型内存中的作业。
例如,假设您有一个需要150GB RAM的spark作业,因此您必须在Spark集群中运行5x30GB执行程序,因为JVM垃圾收集器无法赶上堆大于此的堆。
想象一下,99%的正在处理的数据都是集合中的Strings
。
你认为scala-native会对你有帮助吗?我的意思是,作为Spark的替代品?
它如何对待String
?是否也有此开销,因为jvm将其视为类?
在JVM的情况下,内存(“堆”)GC限制为经典的30GB?我最终会达到30GB的限制吗?
或者这通常是个坏主意?使用scala-native进行内存数据处理。我的猜测是scala-offheap是更好的方式。
答案 0 :(得分:1)
内存中数据处理是一种用例,与JVM上的Scala相比,scala-native将会发光。
SN支持所有类型的内存分配。静态分配(您可以在C中定义全局变量并使用C函数返回指向它的指针),堆栈分配,基于C malloc / free和动态分配的动态分配(Scala new)。
对于字符串,每个字符串可以使用8位字符串,每个字符串使用16位Java样式,或者您可以使用@struct和指针实现自己的小字符串优化,如C ++中所示。
当然,你有一些时间上的缺点,比如SN仍然是0.1之前的版本,并且缺少将Java库移植到Scala。
答案 1 :(得分:0)
目前这是一个坏主意,因为Scala Native还没有为生产使用做好准备。此外,Scala Native使用垃圾收集器(现在是BOEHM)并且会看到与JVM相同的问题,但是使用Scala Native,您可以尝试手动内存管理。