アーディティヤ:
そう。私はもう試した:
StringBuilder sb = new StringBuilder();
for(String bufferItem: buffer){
sb.append(bufferItem);
}
私も試してみました:
String.join("\n", buffer)
私は100ギガバイトを超えると、システム上のメモリに(10ギガバイトの下で)大きなファイルを結合しています。以下は、スタックトレースです。どのように私はこの問題を解決することができますか?
Exception in thread "main" java.lang.OutOfMemoryError
at java.lang.AbstractStringBuilder.hugeCapacity(AbstractStringBuilder.java:161)
at java.lang.AbstractStringBuilder.newCapacity(AbstractStringBuilder.java:155)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:125)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)
at java.lang.StringBuilder.append(StringBuilder.java:136)
at java.lang.StringBuilder.append(StringBuilder.java:76)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:484)
at java.lang.StringBuilder.append(StringBuilder.java:166)
at java.util.StringJoiner.add(StringJoiner.java:185)
at java.lang.String.join(String.java:2504)
アーウィンBolwidt:
あなたは、その多くの文字を含む文字列を作成することはできません。OutOfMemoryError
ヒープがいっぱいであったためではありませんが、可能な最大サイズよりも大きい文字列を構築しようとしているので。
可能な最大サイズは、おおよそのは、2GBのは、あなただけのファイルでシングルバイト文字を使用する場合は、その電源31から2、マイナス1、マイナス8と定義されます。のソースを参照してくださいAbstractStringBuilder
。
/**
* The maximum size of array to allocate (unless necessary).
* Some VMs reserve some header words in an array.
* Attempts to allocate larger arrays may result in
* OutOfMemoryError: Requested array size exceeds VM limit
*/
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
あなたは、単によりも大きな文字列を作成することはできません。
なぜあなたは、ディスクにストリーミングしながら、あなたがそれらを結合することができたときにメモリ内のファイルを結合したいですか?