2016-05-16 9 views
0

может кто-нибудь дать мне подсказку, как это работает с более крупными данными:поток памяти для больших объемов данных

using (MemoryStream ms = new MemoryStream()) 
{ 
    ser.Serialize(ms, files); 
    filesBytes = ms.ToArray(); 
} 

файлами массив пользовательского типа, который включает в себя информацию о файлах

сер двоичной форматировщик

Эти объекты должны быть сериализовать

public class FileEntry 
{ 
    public string FileName { get; set; } 
    public string RelativePath { get; set; } 
    public byte[] Content { get; set; } 
} 
+0

Что значит точно? –

+0

Когда я пытаюсь запустить этот код, возникает исключение из памяти –

+1

Насколько велики данные, которые вы пишете в потоке? Вы работаете с 32 или 64-битным процессом? –

ответ

2

Он выделяет память для по крайней мере, вдвое больше общего размера сериализованных данных.

После того, как для потока памяти и второй раз для нового буфера, что необходимо выделить для ToArray()

Вы можете использовать ms.GetBuffer(), чтобы получить внутренний буфер, но помните, что это, скорее всего, больше, чем фактические данные. Таким образом, вы должны использовать его в сочетании с ms.Length

Если общий размер очень большой, лучше использовать файловый поток и вернуть Stream вместо byte[] из метода.

+2

Учитывая, что он сериализует массив объектов, которые уже имеют содержимое файла в 'byte []', его код будет как минимум * тройным * загружать память. Определенно требуется рефакторинг для работы с базовыми потоками. –

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

  • Нет связанных вопросов^_^