Создаю StreamReader, читаю им последовательно несколько файлов размером 10-80 МБ. Когда все прочитано, вызываю метод StreamREader.Close(), но никаких изменений в объеме выделенной памяти не происходит. Из каждого файла извлекается по единственной строке длиной ~30 символов. В результате такой обработки объем выделенной памяти подскакивает с 40 до 60 МБ. Даже 40 МБ меня пугают, не говоря уже о 60.
Подскажите, как сократить объем выделяемой памяти? Есть какие-то методы оптимизации, принудительной сборки мусора?
Здравствуйте, Flammable, Вы писали:
F>Подскажите, как сократить объем выделяемой памяти? Есть какие-то методы оптимизации, принудительной сборки мусора?
Сборка мусора для того и сделана чтобы об освобождении памяти — НЕ думать.
Когда нужно, тогда и память и будет освобождена. В том числе и по просьбе ОСи. А если 2Гига и только ваше приложение, то: F>Даже 40 МБ меня пугают, не говоря уже о 60.
чего именно пугаетесь? Что ОСь не просит приложение вернуть в ее распоряжение какие-то там пару десятков мегабайт?
Если Вам хочется ручного управления памятью, переходите на С++
Здравствуйте, Skynin, Вы писали:
S>Здравствуйте, Flammable, Вы писали:
F>>Подскажите, как сократить объем выделяемой памяти? Есть какие-то методы оптимизации, принудительной сборки мусора? S>Сборка мусора для того и сделана чтобы об освобождении памяти — НЕ думать.
S>Когда нужно, тогда и память и будет освобождена. В том числе и по просьбе ОСи. А если 2Гига и только ваше приложение, то: F>>Даже 40 МБ меня пугают, не говоря уже о 60. S>чего именно пугаетесь? Что ОСь не просит приложение вернуть в ее распоряжение какие-то там пару десятков мегабайт?
S>Если Вам хочется ручного управления памятью, переходите на С++
Программа немаленькая, уже написана. Не нравятся мне такие огромные траты памяти впустую.
Добавил после ресурсоемких операций вызов метода GC.Collect(), использование памяти стало на 5 мб меньше.
Сейчас просто загруженная форма занимает 30 мб памяти. Что можно хранить в 30 мегабайтах? Это же извращенство.. Потому и спрашиваю, может есть способы сократить объем выделяемой памяти.
Здравствуйте, Flammable, Вы писали:
F>Кроме того меня интересует, почему StreamReader.Close() ничего не делает. Собственно, как и StreamReader.Dispose()
Ну открой исходники и посмотри. Делов на пять минут.
Здравствуйте, Flammable, Вы писали:
F>В результате такой обработки объем выделенной памяти подскакивает с 40 до 60 МБ. F>Подскажите, как сократить объем выделяемой памяти? Есть какие-то методы оптимизации, принудительной сборки мусора?
Под Windows "выделенная память" == "сферический конь в вакууме". Я бы рекомендовал для начала почитать об управлении памятью в Windows (например, у Рихтера), потом об управлении памятью NET, а также справку к диспетчеру задач (если Вы им пользуетесь) чтобы ориентироваться, какой смысл имеют значения в разных столбцах.
Здравствуйте, Jolly Roger, Вы писали:
JR>Под Windows "выделенная память" == "сферический конь в вакууме". Я бы рекомендовал для начала почитать об управлении памятью в Windows (например, у Рихтера), потом об управлении памятью NET, а также справку к диспетчеру задач (если Вы им пользуетесь) чтобы ориентироваться, какой смысл имеют значения в разных столбцах.
И, добавлю, не путаться в терминологии, поскольку у меня впечатление такое, что авторы этой терминологии нас специально запутывают
Здравствуйте, Flammable, Вы писали:
F>Кроме того меня интересует, почему StreamReader.Close() ничего не делает. Собственно, как и StreamReader.Dispose()
А он и не должен ничего делать. Он ничего не держит в себе, кроме малеьнокого буфера на несколько байт.
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, Flammable, Вы писали:
F>>Кроме того меня интересует, почему StreamReader.Close() ничего не делает. Собственно, как и StreamReader.Dispose()
L>А он и не должен ничего делать. Он ничего не держит в себе, кроме малеьнокого буфера на несколько байт.
Тогда на что тратятся 20 мб памяти во время чтения файлов?
Здравствуйте, Flammable, Вы писали:
F>>>Кроме того меня интересует, почему StreamReader.Close() ничего не делает. Собственно, как и StreamReader.Dispose()
L>>А он и не должен ничего делать. Он ничего не держит в себе, кроме малеьнокого буфера на несколько байт.
F>Тогда на что тратятся 20 мб памяти во время чтения файлов?
Скорее всего на временные строки. Скачайте какой-нить профайлер, который умеет смотреть память .Net-ных процессов и посмотрите, на что тратится память.
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, Flammable, Вы писали:
F>>>>Кроме того меня интересует, почему StreamReader.Close() ничего не делает. Собственно, как и StreamReader.Dispose()
L>>>А он и не должен ничего делать. Он ничего не держит в себе, кроме малеьнокого буфера на несколько байт.
F>>Тогда на что тратятся 20 мб памяти во время чтения файлов?
L>Скорее всего на временные строки. Скачайте какой-нить профайлер, который умеет смотреть память .Net-ных процессов и посмотрите, на что тратится память.
И что, от этих бесполезных временных строк нельзя избавляться?
Здравствуйте, Flammable, Вы писали:
F>>>Тогда на что тратятся 20 мб памяти во время чтения файлов?
L>>Скорее всего на временные строки. Скачайте какой-нить профайлер, который умеет смотреть память .Net-ных процессов и посмотрите, на что тратится память.
F>И что, от этих бесполезных временных строк нельзя избавляться?
Можно. Когда будет нужно, сборщик мусора их соберет.
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, Flammable, Вы писали:
F>>>>Тогда на что тратятся 20 мб памяти во время чтения файлов?
L>>>Скорее всего на временные строки. Скачайте какой-нить профайлер, который умеет смотреть память .Net-ных процессов и посмотрите, на что тратится память.
F>>И что, от этих бесполезных временных строк нельзя избавляться?
L>Можно. Когда будет нужно, сборщик мусора их соберет.
Тем не менее он сборщик мусора ничего не собирает и память не освобождается.
Здравствуйте, Flammable, Вы писали:
F>И что, от этих бесполезных временных строк нельзя избавляться?
Они не бесполезные, и скорее всего сборщиком уже собраны. Если не хочется углубляться в механизмы, то можно принять за аксиому, что управление памятью в Windows писали отнюдь не ламеры. NET'овскую надстройку, я думаю, тоже.
Здравствуйте, Flammable, Вы писали:
F>>>И что, от этих бесполезных временных строк нельзя избавляться?
L>>Можно. Когда будет нужно, сборщик мусора их соберет.
F>Тем не менее он сборщик мусора ничего не собирает и память не освобождается.
Скачайте какой-нить профайлер, который умеет смотреть память .Net-ных процессов и посмотрите, на что тратится память.
Покажите тут в трех строках, как вы последовательно несколько файлов читаете одним ридером. Такое ощущение, что я чего-то пропустила и не представляю, как это вообще можно сделать. Прямо начиная от создания ридера, или от создания того Stream'а, который собственно файл читает. Т.е. с самого начала работы с файлами и до Close.
Скорей всего проблема вовсе не в Closе, а где-то раньше, если она вообще есть конечно
Здравствуйте, Jolly Roger, Вы писали:
JR>Если не хочется углубляться в механизмы, то можно принять за аксиому, что управление памятью в Windows писали отнюдь не ламеры. NET'овскую надстройку, я думаю, тоже.
Только, далеко не факт, что ценности этих не-ламеров совпадают с вашими.
_FR>Это очень легко: стрим, который внутри себя открывает по необходимости дополнительные стримы
Ну нет, автор в вопросе вообще стримы не упоминает. В любом случае, позволю себе считать, что тогда стрим ридер был не один, а с кем-то
Лучше не гадать, а подождать пока автор код покажет. А то на догадках можно тотализатор открывать