1G raw 文字列は、8G 以上のメモリを簡単に使用できます。XML 用の XMLEventReader のようなストリーミング処理を使用することをお勧めします。
Rober Sedgewick と Kevin Wayne による書籍 Algorithm の見積もりを参照してください。各文字列には 56 バイトのオーバーヘッドがあります。
私は簡単なテストプログラムを書いて実行しました-Xmx8G
object TestStringBuilder {
val m = 1024 * 1024
def memUsage(): Unit = {
val runtime = Runtime.getRuntime
println(
s"""max: ${runtime.maxMemory() / m} M
|allocated: ${runtime.totalMemory() / m} M
|free: ${runtime.freeMemory() / m} M""".stripMargin)
}
def main(args: Array[String]): Unit = {
val builder = new StringBuilder()
val size = 10 * m
try {
while (true) {
builder.append(Math.random())
if (builder.length % size == 0) {
println(s"len is ${builder.length / m} M")
memUsage()
}
}
}
catch {
case ex: OutOfMemoryError =>
println(s"OutOfMemoryError len is ${builder.length/m} M")
memUsage()
case ex =>
println(ex)
}
}
}
出力は次のようになります。
len is 140 M
max: 7282 M allocated: 673 M free: 77 M
len is 370 M
max: 7282 M allocated: 2402 M free: 72 M
len is 470 M
max: 7282 M allocated: 1479 M free: 321 M
len is 720 M
max: 7282 M allocated: 3784 M free: 314 M
len is 750 M
max: 7282 M allocated: 3784 M free: 314 M
len is 1020 M
max: 7282 M allocated: 3784 M free: 307 M
OutOfMemoryError len is 1151 M
max: 7282 M allocated: 3784 M free: 303 M