2010-01-16 6 views
0

스트림 판독기를 사용하여 C#에서 파일을 여는 동안 파일을 닫을 때까지 메모리에 남아 있습니다. 예를 들어, 파일의 끝에 한 줄을 추가하기 위해 streamreader를 사용하는 프로그램이 크기가 6MB 인 파일을 열 경우. 파일이 닫힐 때까지 프로그램이 전체 메모리를 6MB로 유지합니까? OR는 .Net 코드에 의해 내부적으로 반환 된 파일 포인터이며 끝에 라인이 추가됩니다. 따라서 6MB 메모리는 프로그램에 의해 사용되지 않습니다.파일 열기 메모리 C#

답변

1

에서는 StreamReader 파일을 열하여 FileStream을 사용하여 언급 한 사람으로 버퍼링 및 OS 캐싱을 계산하지. FileStream은 CreateFile() API 함수가 반환 한 Windows 핸들을 저장합니다. 32 비트 운영 체제에서는 4 바이트입니다. FileStream에도 byte [] 버퍼가 있으며, 기본적으로 4096 바이트입니다. 이 버퍼는 모든 단일 읽기 호출에 대해 ReadFile() API 함수를 호출하지 않아도됩니다. StreamReader에는 파일의 텍스트를 더 효율적으로 디코딩 할 수 있도록 작은 버퍼가 있으며 기본적으로 128 바이트입니다. 또한 버퍼 인덱스를 추적하고 BOM이 탐지되었는지 여부를 추적하는 일부 개인 변수가 있습니다.

이 모두가 몇 킬로바이트입니다. StreamReader로 읽은 데이터는 물론 프로그램의 힙에서 공간을 차지합니다. 문자열 (예 : 목록)으로 저장하면 최대 12 메가 바이트까지 추가 할 수 있습니다. 당신은 대개 그것을 피하고자합니다.

5

스트림의 전체 지점은 전체 객체를 메모리에 보유 할 필요가 없도록합니다. 당신은 필요에 따라 조각으로 읽습니다.

파일에 추가하려면 File.AppendText을 사용해야 파일 끝에 추가되는 StreamWriter이 생성됩니다.

string path = @"c:\temp\MyTest.txt"; 

// This text is always added, making the file longer over time 
// if it is not deleted. 
using (StreamWriter sw = File.AppendText(path)) 
{ 
    sw.WriteLine("This"); 
    sw.WriteLine("is Extra"); 
    sw.WriteLine("Text"); 
} 

다시 전체 파일이 메모리에 저장되지 않을 것이다 : 여기

는 일례이다.

문서 : http://msdn.microsoft.com/en-us/library/system.io.file.appendtext.aspx

2

닷넷 FileStream 적은 양의 데이터를 (당신이 생성자의 일부와이 금액을 설정할 수 있습니다) 버퍼됩니다.

Windows OS는 파일의 더 중요한 캐싱을 수행합니다. 충분한 RAM이 있으면 전체 파일 일 수 있습니다.

1

StreamReader 아니요, 6MB 파일을 메모리로 읽습니다. 또한 StreamReader를 사용하여 파일 끝에 줄을 추가 할 수 없습니다. StreamWriter를 사용할 수도 있습니다.

갱신 : 다른