2013-02-25 6 views
2

내 응용 프로그램에서 Windows 서비스를 사용하여 파일을 읽습니다. 이 서비스는 매초마다 파일을 읽습니다. 나는 System.OutOfMemoryException을 얻고 약간의 시간 후에OutOfMemoryException 파일을 읽는 중

public static byte[] GetBytesFromFile(string fullFilePath) 
{ 
    FileStream fs = File.OpenRead(fullFilePath); 
    try 
    { 
     byte[] bytes = new byte[fs.Length]; 
     fs.Read(bytes, 0, Convert.ToInt32(fs.Length)); 
     fs.Close(); 
     return bytes; 
    } 
    finally 
    { 
     fs.Close(); 
    } 
} 

: 이것은 내가 파일을 읽을 사용하고있는 코드입니다. 내가 여기서 뭐 잘못하고 있니?

업데이트 : 나는이 코드에 반환 된 바이트를 사용하고 있습니다 : 문제가 분명하다

object s = null; 
System.Reflection.Assembly a = Assembly.Load(bytes); 
object o = a.CreateInstance("ID_" + report.ID.ToString().Replace("-", "_")); 

Type t = o.GetType(); 
MethodInfo mi = t.GetMethod(name); 
object[] values = new object[1]; 
values[0] = nameValue; 
s = mi.Invoke(o, values); 
return s; 
+3

팁 : FileStream 유형에서 Using() 블록을 사용하십시오. 그렇게하면 마침내 또는 명백한 Close Call이 필요하지 않습니다. – Zenwalker

+0

읽기 파일의 크기가 일정하거나 때로 다양합니까? – Zenwalker

+0

당신이 읽으려고하는 파일의 크기는 어느 정도입니까? – ryadavilli

답변

4

편집으로 : 여기

System.Reflection.Assembly a = Assembly.Load(bytes); 

는 일이 : 안 어셈블리 AppDomain에서을 언로드하십시오. DynamicMethod과 같은 일부 가비지 수집 가능 항목이 있지만 전체 조립품은 아닙니다. 어셈블리를로드하는 경우이를 수행하는 유일한 방법은 해당 프로세스의 AppDomain입니다. 그런 다음 완료되면 AppDomain을 던져 버릴 수 있습니다 (이 모든 것을 언로드합니다). Read 모든 데이터를 읽을 수 하지을 보장하는 것은 아닙니다 -

사실, 기존의 코드도 작동 보장은 없습니다. 그 블로그에 대한 보류중인 블로그 게시물이 있습니다 ...

하지만 파일이 크면 압축되지 않는 힙인 LOH가 서서히 포화 상태 일 가능성이 큽니다. 제가 제안 할 수있는 최선의 충고는 배열로 거대한 파일을 읽지 마십시오. Stream API, 일종의 "리더"API 또는 일종의 파싱 반복자 블록으로 작동하도록 다운 스트림 코드를 다시 작성하십시오.

나머지 코드가 어떻게 처리되는지 보지 않고 더 자세히 말하기는 어렵습니다. 그러나 코드에서 메모리 프로파일 러를 실행하여 실제로 메모리 문제를 일으키는 것이 byte[]인지 확인하는 것이 좋습니다.

+0

"포화"란 정확히 무엇을 의미합니까? 단편화? – CodesInChaos

+0

@Marc, 내 파일 크기는 약 4KB입니다. VMMap 도구를 사용하면 개인 데이터가 꾸준히 증가하지만 CPU 사용률은 약 2 %입니다. 내 게시물을 업데이트하여 반환 된 바이트를 사용하는 위치를 표시합니다. 이 코드를 구현하는 가장 좋은 방법에 대한 몇 가지 코드 샘플을 제공해 주시겠습니까? – PSR

+0

LOH = _ 대형 오브젝트 힙 _은 약 83 KiB보다 큰 오브젝트에 대해 가비지 수집되지 않는 특수 힙입니다. – Virtlink