2012-10-06 15 views
7

Necesito escribir 10,000 x 30,000 caracteres. ¿podrá un único generador de cuerdas acomodar todos los caracteres o debería pensar en una matriz de constructores de cuerdas? No tengo acceso a los casos de prueba, así que no puedo verificarlo yo mismo. Espero encontrar la respuesta aquí.Número máximo de caracteres stringbuilder puede acomodar

Gracias de antemano.

EDIT:

He intentado añadir 10000 x 30000 caracteres usando un bucle. Recibo las siguientes excepciones.

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
at java.util.Arrays.copyOf(Arrays.java:2367) 
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:130) 
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:114) 
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:415) 
at java.lang.StringBuilder.append(StringBuilder.java:132) 
at Test.main(Test.java:19) 

¿Qué hacer con este "java heap space"?

Respuesta

14

La longitud es un int, por lo que debe contener hasta 2GChar (4GB) suponiendo que tiene la memoria. Vas a usar "solo" 600MB (300 millones a 2 bytes por personaje). Solo tenga cuidado con la cantidad de copias que termina haciendo ... es decir, toString().

+0

Intenté agregar 10000x30000 caracteres mediante un bucle y se producen errores. por favor mira la edición. –

+2

Necesita aumentar el espacio de almacenamiento dinámico disponible para la VM con la opción de línea de comando '-Xms1024m -Xmx1536m', que establecerá la asignación inicial en 1GB y la máxima en 1.5GB. Si está ejecutando en un entorno de 32 bits, esto puede ser problemático. –

3

Lo que debe preocuparse es el tamaño máximo de almacenamiento dinámico. No va a hacer ninguna diferencia si usa objetos StringBuilder únicos o múltiples.

1

Siempre que la longitud de la secuencia de caracteres contenida en el generador de cadenas no exceda la capacidad, no es necesario asignar un nuevo búfer interno. Si el buffer interno se desborda, se hace automáticamente más grande. Y le da la cantidad máxima de caracteres que esta memoria de instancia de StringBuilder puede contener en este momento.

Cuestiones relacionadas