2012-12-14 6 views
2

SharePoint에서 파일을 다운로드하려고합니다. 약간의 연구를 한 후에, 나는 이것을 얻었고 우리가 버퍼를 사용한다면 성능면에서 더 좋을 것이라고 말한다.스트림에 대한 혼동

비고 - 파일은 우리가 (RAM을 소모 시작) STRM 객체의 전체 스트림을 받고, response.BinaryWrite(file.OpenBinary()); 같이 지정되면 SPFILE

using (System.IO.Stream strm = file.OpenBinaryStream()) 
{ 
    byte[] buffer = new byte[BUFFER_SIZE]; 
    int bytesRead; 
    do 
    { 
     bytesRead = strm.Read(buffer, 0, BUFFER_SIZE); 
     response.OutputStream.Write(buffer, 0, bytesRead); 
     response.Flush(); 
    } while (bytesRead > 0); 
} 

입니까? 파일이 10MB라고 가정하면이 strm은 RAM에서 10MB가됩니까?

아니면 우리가 독서를 시작하면 메모리를 소비하기 시작할 것입니까? bytesRead = strm.Read(buffer, 0, BUFFER_SIZE);

답변

3

Stream은 파이프이지만 버킷이 아닙니다. 데이터를 "포함"하지 않으며 단지 액세스을 데이터로 관리합니다. 이 예제의 경우 앱에서 언제든지로드 한 데이터는 BUFFER_SIZE 바이트입니다 (다른 레이어에서 사용하는 다른 모든 버퍼를 더한 값).

각 글마다 Flush() (실제로는 Flush()이 적합 할 수도 있음)이 필요하지 않습니다.

당신이 가진 것은 괜찮습니다. 내가 말하고자하는 유일한 것은 .NET의 최신 버전에서 이것을 단순화 할 수 있다는 것입니다.

using (System.IO.Stream strm = file.OpenBinaryStream()) 
{ 
    strm.CopyTo(response); 
    // response.Flush(); // optional: only included because it is in the question 
} 
+0

> 답변 해 주셔서 감사합니다. 만약 내가 직접 ** response.BinaryWrite (file.OpenBinary()); ** 반복 대신? 그것은 메모리 문제가있을 것인가? – kevin

+0

@kevin 루프를 사용하지 않으려면 CopyTo를 사용하십시오. –