2013-11-16 4 views
1

Звучит как дубликат, но я не нашел никакого соответствующего решения. Я разрабатываю настольное приложение, где пользователи загружают файлы на сервер через HTTP. Приложение отлично работает, но оно использует слишком много памяти, так как я должен открыть файл FileStream для его загрузки.Удалить поток файлов из памяти

Я пробовал звонить .Dispose() и using (var fs = File.Open(path, mode)){}, но, очевидно, он не освобождает память, просто удаляет объекты.

Я также попытался с:

GC.Collect(); 

GC.WaitForPendingFinalizers(); 

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

  1. Я прочитал файл.
  2. Я загружаю файл.
  3. Я удаляю файл (из памяти).

Как я могу это сделать?

+5

«но он использует слишком много памяти». Каковы ваши доказательства этого? Каковы симптомы? Вы просто отличаетесь от мнения ГК? – spender

+0

Пользователи имеют ограничение на загрузку 512 Мб, поэтому я попытался загрузить большой файл, и когда я смотрю на диспетчер задач, используемая память увеличивается и остается такой (после процесса). Когда я использовал GC, это происходит так же, НО память уменьшается с 530 мб (весь размер файла + используемая память) до 20 мб, он работает, как я ожидаю, но я сомневаюсь, пользуюсь им или нет. – Neo

+0

@neo. Вы доказали, что память будет освобождена, когда сбор мусора произойдет вызов 'GC.Collect()'. Итак, теперь вы знаете, что как только условия для сбора мусора будут выполнены, память будет освобождена (обратите внимание, что это происходит не очень часто и обычно только при низкой памяти). –

ответ

1

У вас есть Close()FileStream, когда вы закончите с ним.

Общий подход заключается в использовании using вместо управления этим самостоятельно:

using(var input = File.Open(filename)) 
{ 
    // use input to read/upload/etc 

} // input gets closed (via IDisposable.Dispose() here) 

При условии, что FileStream закрыта должным образом, данные файла будут списываться из памяти ГХ автоматически.

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

+1

Я думаю, что метод Dispose уже вызывает метод Close – Neo

+2

@neo, пожалуйста, обратите внимание, что сборка мусора не мгновенная, и происходит не так часто, как вы думаете. Подробнее [здесь] (https://www.google.com.au/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&cad=rja&ved=0CEQQFjAC&url=http%3A%2F%2Fmsdn.microsoft.com% 2Fen-us% 2Flibrary% 2Fee787088 (v% 3Dvs.110) .aspx & ei = LbuGUrSGAce3iQem8YDwAg & usg = AFQjCNFPgVzStIESvkrA9ibjFywA0C9Tiw & sig2 = oJ0HSRBCSKhTjdOb1sTOdw) в разделе «Условия сбора мусора» –

+2

@Neo Насколько велика или сколько файлов вы отправляете?ЕСЛИ вы используете вышеупомянутый подход, сборщик мусора освободит память, когда это необходимо. – jfin3204

Смежные вопросы