2013-04-03 4 views
0

Этот вопрос будет следовать до Efficient way to transfer many binary files into SQL Server databaseКак избежать LOH при чтении двоичного

Первоначально я спросил, почему использование File.ReadAllBytes вызывало быстрое использование памяти и был сделан вывод, используя этот метод размещения данных на больших объектов куче, которая не могут быть легко восстановлены во время выполнения.

Мой вопрос сейчас в том, как избежать этой ситуации?

using (var fs = new FileStream(path, FileMode.Open)) 
{ 
    using (var ms = new MemoryStream()) 
    { 
     byte[] buffer = new byte[2048]; 
     int bytesRead; 
     while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0) 
     { 
      ms.Write(buffer, 0, bytesRead); 
     } 
     return new CustomFile { FileValue = ms.ToArray() }; 
    } 
} 

Следующий код был предназначен, чтобы обойти эту проблему, читая файл на куски, а не все сразу, но это, кажется, та же самая проблема.

ответ

2

Поток памяти содержит внутренний массив для всех данных (которые вы возвращаете в конце). Неважно, что вы читаете в кусках по 2048 байт, если вы продолжаете конкатенацию в поток памяти. Если вам нужно вернуть данные в виде массива, содержащего весь файл, то вы в конечном итоге часто создаете этот массив большой кучей объектов.

Если пункт назначения (поле BLOB или подобное) не позволяет передавать данные каким-либо другим способом, кроме одного байтового массива, то вы не можете обойти выделение массива байтов, который содержит все данные.

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

int Transfer(Stream source, Stream target) 
{ 
    byte buffer = new byte[BufSize]; 
    int totalBytesTransferred = 0; 
    while ((bytesRead = source.Read(buffer, 0, BufSize)) > 0) 
    { 
     target.Write(buffer, 0, bytesRead); 
     totalBytesTransferred += bytesRead;  
    } 
    return totalBytesTransferred; 
} 

Если это возможно, зависит от того, поддерживает ли объект (например, БЛОУ БД) открытие потока цели или нет.

+0

Мы используем Nhibernate с SQL 2008 R2, я не уверен, что поток может быть сохранен непосредственно. – user1838662

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