2014-06-17 87 views
3

我正在創建Windows Phone 8應用程序,我有一個帶有512 MB RAM的Windows Phone 8,當我在模擬器上運行應用程序時,它運行得非常好,但是當我檢查Windows電話8設備,我得到例外Windows Phone 8中的System.OutOfMemoryException

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

你真的想把所有的文件內容放到內存中嗎?你不能通過塊來轉換文件塊嗎? –

+0

是的。 VIDEO文件假定有一個視頻文件。它有多大?我強烈建議不要像這樣讀取它 - 使用較小的緩衝區(512kb),並按大塊移動塊。 – TomTom

+0

您的設備具有x空閒MB的事實並不意味着您可以實際分配x MB。有這種東西叫做內存碎片。此外,有可能是每個應用程序的限制。 – dandan78

回答

0

你認爲它是「沒有記憶」。它確實是「一塊不夠的記憶」。 LOH碎片(大對象堆)是已知的問題。

像這樣加載文件是非常低效的。

第一:

new MemoryStream() 

即陣列的重分配的噸。預先將其初始化爲數組的大小。

不過還好:

移動在512KB塊中的數據,這樣你就不會大量內存。無需一次將所有內容加載到內存中。

+0

謝謝你,但你能通過代碼告訴我,我不知道,謝謝你的快速回復! –

+0

幽靈,你能引導我的代碼,兄弟! –

+0

是的,我可以,但我通常不提供「準備好,我爲你做了你的工作」的解決方案。一旦他們得到提示問題出在什麼地方,我便可以利用他們的大腦來處理文檔。 – TomTom