2012-10-06 7 views
7

Potrzebuję napisać 10 000 x 30 000 znaków. czy pojedynczy konstruktor stringów będzie w stanie acomodować wszystkie znaki, czy powinienem myśleć o tablicy konstruktorów? Nie mam dostępu do przypadków testowych, więc nie mogę sam tego zweryfikować. Mam nadzieję, że znajdę tu odpowiedź.Maksymalna liczba znaków dla konstruktora stringów może pomieścić

Z góry dziękuję.

EDIT:

Próbowałem dodać 10000 x 30000 znaków za pomocą pętli. Dostaję następujące wyjątki.

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) 

Co zrobić z tym "miejscem na java java"?

Odpowiedz

14

Długość to int, więc powinna zawierać do 2 GChar (4 GB), zakładając, że masz pamięć. Użyjesz "tylko" 600 MB (300 milionów @ 2 bajty na znak). Po prostu uważaj, ile kopii wykonasz ... to jest toString().

+0

Próbowałem dodać 10000 x 30000 znaków za pomocą pętli, co daje błędy. zobacz edycję. –

+2

Należy zwiększyć obszar sterty dostępny dla maszyny wirtualnej za pomocą opcji wiersza polecenia -Xms1024m -Xmx1536m', która ustawi początkową alokację na 1 GB, a maks. Na 1,5 GB. Jeśli pracujesz w środowisku 32-bitowym, może to być problematyczne. –

3

To, o co należy się martwić, to maksymalny rozmiar sterty. Nie ma znaczenia, czy używasz pojedynczego obiektu, czy wielu obiektów StringBuilder.

1

Dopóki długość sekwencji znaków zawartej w konstruktorze ciągów nie przekracza pojemności, nie jest konieczne przydzielanie nowego bufora wewnętrznego. Jeśli bufor wewnętrzny przepełni się, zostanie automatycznie powiększony. I daje maksymalną liczbę znaków, które pamięć instancji StringBuilder może pomieścić w tym czasie.

Powiązane problemy