Java OutofMemoryException при добавлении большой строки с использованием StringBuilder / StringWriter / String.format () - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь решить проблему программирования, в которой я имею дело со строкой большого размера. Я пытался использовать String, StringBuilder, но получил OutOfMermoryException Java Heap Space при добавлении строки. при попытке с StringWriter с String.format () запуск программы занимает вечность (более 15 минут).

Пожалуйста, предложите, что можно использовать, когда длина String равна 736778906400L Я прикрепил код (git -repo)

Ответы [ 2 ]

0 голосов
/ 16 июня 2020

Как отмечают @Erwin Bolwidt и другие, StringBuffer не будет работать для значений выше максимального значения int, а также зависит от памяти, доступной для вашей виртуальной машины. Ваша программа, вероятно, ударит OutOfMemory на том или ином этапе задолго до этого предела, потому что StringBuffer.append работает, перераспределяя больший и копируя символы, когда он достигает текущего размера буфера, поэтому у вас должно быть место для 2 огромных строк в память сразу.

Вы можете обойти некоторые проблемы, сделав infiniteString () preize с конструктором «new StringBuffer (int someLength)» с количеством символов, которые вы хотите добавить, это позволяет избежать перераспределения внутренних буфер после первоначального предварительного определения размера.

Если вы избежали OOM к этому моменту, строка infiniteString.toCharArray () также делает копию буфера. Если вы заставляете infiniteString () возвращать свой StringBuffer, вы можете вызывать sb.charAt и sb.length при циклическом переборе символов, а не char []

Каждый вызов String.valueOf (StringBuilder) копирует буфер, это может ускорить время до OOM.

0 голосов
/ 16 июня 2020

Если нужно просто посчитать символы в повторяющейся строке - посчитайте:

   static long repeatedString(String s, long n) {
        final char charToCheck='a';
        if (s.indexOf(charToCheck)>=1) {
            return s.chars()
                    .filter(value -> value == (int)charToCheck)
                    .count()*n;
        } else
            return 0;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...