Как освободить или переработать строку в C #? - PullRequest
8 голосов
/ 06 сентября 2011

У меня есть большая строка (например, 20 МБ).

Я сейчас разбираю эту строку. Проблема в том, что строки в C # являются неизменяемыми; это означает, что как только я создал подстроку и посмотрел на нее, память теряется.

Из-за всей обработки память забивается String объектами, которые я больше не использую, не нуждаюсь или не использую; но сборщик мусора занимает слишком много времени, чтобы освободить их.

Итак, приложению не хватает памяти.

Я мог бы использовать неэффективный подход club и посылать несколько тысяч звонков:

GC.Collect();

везде, но это на самом деле не решает проблему.

я знаю, StringBuilder существует, когда создает большую строку.

я знаю, TextReader существует для чтения String в массив char.

мне нужно каким-то образом " повторно использовать " строку, чтобы она больше не была неизменной, чтобы я не мог без необходимости выделять гигабайты памяти, когда это сделает 1k.

Ответы [ 3 ]

11 голосов
/ 06 сентября 2011

Если ваше приложение умирает, это вероятно , потому что у вас все еще есть ссылки на строки, а не потому, что сборщик мусора просто не может их очистить.Я видел , что это провал, но это маловероятно.Вы использовали профилировщик, чтобы проверить, действительно ли у вас действительно много строк в памяти за раз?

Короче говоря, вы не можете повторно использовать строку для хранения разных данных - это просто невозможно сделать.Вы можете написать свой собственный эквивалент, если хотите - но шансы сделать это эффективно и правильно довольно малы.Теперь, если бы вы могли дать больше информации о том, что вы делаете, мы могли бы предложить альтернативные подходы, которые не используют так много памяти.

1 голос
/ 06 сентября 2011

Я бы предложил, учитывая тот факт, что вы не можете повторно использовать строки в C # , используйте Файлы с отображением в памяти . Вы просто сохраняете строку на диске и обрабатываете ее с отличным соотношением производительность / потребление памяти через сопоставленный файл как поток. В этом случае вы повторно используете тот же файл, тот же поток и работаете только с небольшой частью данных, например строкой, которая вам нужна в этот конкретный момент, и сразу же выбрасываете ее.

Это решение строго зависит от требований вашего проекта, но я думаю, что одно из решений, которое вы можете серьезно рассмотреть, так как особенно потребление памяти резко сократится, но вы «заплатите» что-то с точки зрения производительности.

1 голос
/ 06 сентября 2011

У вас есть пример кода, чтобы проверить, будут ли возможные решения работать хорошо?

В общем, любой объект, размер которого превышает 85 КБ, будет размещен в куче больших объектов , которая, вероятно, будет собирать мусор реже.

Кроме того, если вы действительно сильно нагружаете процессор, сборщик мусора, скорее всего, будет выполнять свою работу реже, стараясь не мешать вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...