#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. Да, я могу, но я обычно не предоставляю решение «готово, я сделал вашу работу за вас» из принципа. Я считаю, что люди должны использовать свой мозг для работы с документацией, как только они получат подсказку, в чем проблема.