2016-05-12 37 views
0

他の投稿を確認したところ、この問題を解決する方法が見つかりませんでした。System.OutOfMemory 1 MBのファイルを読み取るときに例外が発生する

public string Profile(string FileName,byte[] Search, uint align) 
{ 
    string Result = "";   
    Stream fs = File.OpenRead(FileName); 
    byte[] _Search = new byte[Search.Length]; 
    uint check = 0; 
    byte Check_Zero; 

    for (uint i = 0; i < fs.Length; i++) 
    { 
     _Search = func.ReadBytes(FileName, i, _Search.Length); 
     if (func.ByteArrayCompare(_Search, Search)) 
     { 
      check = i + align; 
      break; 
     } 
    } 
    for (uint i = 0; i < 50; i++) 
    { 
     Check_Zero = func.ReadByte(FileName, check); 
     if (Check_Zero == 0) 
      check++; 
     else 
     { 
      Result = func.ReadString(FileName, check); 
      break; 
     } 
    } 
    return Result; 
} 

私は2つの異なるファイルからの読み取りを試みています。私は9.52KBのファイルから読み込むときに問題はありませんが、1.00MBのファイルから読み込もうとすると、OutOfMemory例外が発生します。

ここでは、ReadBytes()が役立ちます。私が使用した関数

public static byte[] ReadBytes(string filename, uint address, int length) 
{ 
    var buff = new byte[length]; 
    Stream fs = File.OpenRead(filename); 
    BinaryReader b = new BinaryReader(fs); 
    b.BaseStream.Seek(address, SeekOrigin.Begin); 
    b.Read(buff, 0, length);//This is where it breaks. 
    return buff; 
} 
+0

好奇心を要しています - これはどのシステムで実行されていますか?スクリプト言語や何か古代、おそらく。 –

+3

はじめに、なぜファイルを2つストリームで開きますか、そしてそれらを正しく処分するためにストリーム上で 'using()'ステートメントを持っていないのはなぜですか?ファイルを一度開いてから読み込み、ストリームを破棄します。 –

+0

あなたは1Mbで、1Gbではないと確信していますか?検索のサイズを確認してください。 – Gusman

答えて

4

この問題はyfReadBytesの実装によって引き起こされます。 1MBファイルの場合は1 000 000回と呼ばれ、毎回ファイルを開き、ファイルを閉じないため、unmanaged handlesが漏れています。 File.OpenReadは非常に特別なストリーム、すなわち、漏れを防ぐために明示的に配置されなければならないFileStreamを返します。

修正する方法の1つは、静的メソッドFile.ReadAllBytesを使用することです。その場合は何も処理する必要はありません。

ファイルを一度開いて、filenameの代わりにReadBytes関数にFileStream参照を渡すことをお勧めします。最後に明示的に処理することを忘れないでください。たとえば、usingステートメントを使用します。そうすれば、あなたのReadBytes関数は1行になり、非常に単純な関数なので、その関数は必要なくなり、コードはより速く簡単になります。

関連する問題