Система.Исключение OutOfMemoryException в Windows Phone 8

#c# #windows-phone-8 #out-of-memory

#c# #windows-phone-8 #нехватка памяти

Вопрос:

Я создаю приложение для Windows Phone 8, у меня Windows Phone 8 с 512 МБ оперативной памяти, когда я запускаю приложение на эмуляторе, оно работает очень хорошо, но когда я проверяю устройство Windows Phone 8, я получаю исключение

 System.OutOfMemoryException
  

Когда все еще остается много свободной памяти.
Смотрите мой код ниже:

 private IsolatedStorageFileStream isoVideoFile;
string isoVideoFileName = "Movie.mp4";

using (isoVideoFile = new IsolatedStorageFileStream(isoVideoFileName,
FileMode.OpenOrCreate, FileAccess.ReadWrite,
IsolatedStorageFile.GetUserStoreForApplication()))
{
   using (MemoryStream stream = new MemoryStream())
   {
     isoVideoFile.Write(stream.GetBuffer(), 0, (int)stream.Position);
   } 
     byte[] binaryData = new Byte[isoVideoFile.Length];

     long bytesRead = isoVideoFile.Read(binaryData, 0, (int)isoVideoFile.Length);
     string videofile = Convert.ToBase64String(binaryData, 0, binaryData.Length);                               
 }
  

Комментарии:

1. Вы действительно хотите поместить все содержимое файла в память? Разве вы не можете конвертировать фрагмент файла за фрагментом?

2. Да. Видеофайл предполагает видеофайл. Насколько оно велико? Я бы настоятельно рекомендовал не читать это так — используйте буферы меньшего размера (512 КБ) и просто перемещайте фрагмент за фрагментом.

3. Тот факт, что на вашем устройстве имеется x свободных МБ, не означает, что вы действительно можете выделить x МБ. Существует такая вещь, как фрагментация памяти. Кроме того, вероятно, существует ограничение для каждого приложения.

4. Итак, вы загружаете весь фильм в поток памяти, затем отбрасываете поток, затем снова считываете фильм в массив байтов (игнорируя, сколько байтов было фактически прочитано), а затем преобразуете это в строку Base64. Неудивительно, что у вас заканчивается память.

5. Я хотел сказать, но, чувак, это не «новичок в сценарии и платформе», это «программирование для не совсем новичков».

Ответ №1:

Вы предполагаете, что это «нет памяти». Это действительно «недостаточно памяти в одном месте». Фрагментация LOH (куча больших объектов) является известной проблемой.

Загрузка такого файла ужасно неэффективна.

Первый:

 new MemoryStream()
  

Это ТОННЫ перераспределений массива. Предварительно инициализируйте его размером с массив.

Но лучше:

Переместите данные в куски размером 512 КБ, чтобы вы не были таким уж большим объемом памяти. Нет необходимости загружать все это в память сразу.

Комментарии:

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

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