Сборка мусора LOH, WeakReferences, крупные объекты

В моем приложении мне нужно загрузить большие файлы (может быть около ~ 250 МБ) в память, я делаю это ленивым способом - когда пользователь просит посмотреть файл - я загружаю его. После этого каждый раз, когда пользователь пытается получить доступ к файлу, я могу показать его немедленно, потому что он уже находится в памяти. Итак, проблема в сборке мусора... Каждый файл, который я загружаю, я загружаю через WeakReference, НО: я протестировал это несколько раз, я смог загрузить около 3 ГБ в память (чем приложение стало недоступным для использования), но GC не произошло. Я не могу вызвать GC.Collect(2), потому что я не могу определить время для его вызова, так как сказать GC собирать память (слабые ссылки) в хорошие моменты (блин, 3ГБ это слишком много... Кажется, ГК просто не выполняет свою работу) Горячо ее решить? Мне действительно нужна ленивая загрузка, но мне нужно собирать память, когда процесс использует более 1 ГБ или что-то в этом роде

1 ответ

Решение

Есть статическая функция под названием GC.GetTotalMemory(bool forceFullCollection) ( http://msdn.microsoft.com/en-us/library/system.gc.gettotalmemory.aspx). Вы можете использовать его для принудительного сбора мусора перед загрузкой нового файла в память, если вы преодолели какой-то порог.

Редактировать: возможная реализация

public MyFile GetMyFile(){
   if ( !is_my_file_in_memory() ) {
      if (CG.GetTotalMemory(false) > MY_THRESHOLD ) {

        GC.Collect(2);

      }
      load_my_file_in_memory();
   }
   return get_my_file_from_memory();
}
Другие вопросы по тегам