小编Sac*_*kar的帖子

Scala - 在本地范围内的大量文件上执行XML.loadFile时的高堆使用率

我试图从大量的xmls创建一个对象树.但是,当我在大约2000 xml文件(范围从100KB到200MB)上运行以下代码时(注意我已经注释掉了创建对象树的代码),我获得了8-9GB的大内存占用.我希望在下面的示例中内存占用量最小,因为代码不会保留任何引用,它只会创建Elem并将其抛弃.运行完整GC后,堆内存保持不变.

def addDir(dir: File) {
dir.listFiles.filter(file => file.getName.endsWith("xml.gz")).foreach { gzipFile =>
    addGzipFile(gzipFile)
}
}
def addGzipFile(gzipFile: File) {
val is = new BufferedInputStream(new GZIPInputStream(new FileInputStream(gzipFile)))
val xml = XML.load(is)
// parse xml and create object tree
is.close()
}
Run Code Online (Sandbox Code Playgroud)

我的JVM选项是:-server -d64 -Xmx16G -Xss16M -XX:+ DoEscapeAnalysis -XX:+ UseCompressedOops

而jmap -histo的输出看起来像这样

num     #instances         #bytes  class name
----------------------------------------------
   1:      67501390     1620033360  scala.collection.immutable.$colon$colon
   2:      37249187     1254400536  [C
   3:      37287806     1193209792  java.lang.String
   4:      37200976      595215616  scala.xml.Text
   5:      18600485      595215520  scala.xml.Elem
   6:       3420921       82102104  scala.Tuple2
   7: …

scala heap-memory

5
推荐指数
1
解决办法
1120
查看次数

scala - 在不使构造函数参数成为对象成员的情况下创建对象

我有

class Address(elem: scala.xml.Elem){
    val attr1 = (elem \ "attr1") text
    ...
}
Run Code Online (Sandbox Code Playgroud)

我不希望elem成为Address的成员,因为我在内存中创建了数百万个这样的对象,因此将占用空间保持在最小.什么是scala方法来实现这一目标?谢谢.

scala class object

3
推荐指数
1
解决办法
706
查看次数

标签 统计

scala ×2

class ×1

heap-memory ×1

object ×1