0

このコードでファイルを読みたいのですが、682回後に次のエラーが発生します:

タイプ 'System.OutOfMemoryException' の例外がスローされました。

System.IO.StreamReader file = new System.IO.StreamReader(scanpad[lusteller]);

scanpad はファイルパスの配列であり、lusteller はそれに対するカウンターです。Scanpad には 11207 個のファイルが存在します。

また、場所682にファイルがあることも確認しました

誰でも解決策はありますか?

ここに私のコードの完全なバージョンがあります

        using (StreamReader file = new System.IO.StreamReader(scanpad[lusteller]))
        {
            //do stuff

            lengte = bestandsnaam.Length;
            lengte = lengte - 13;
            controller = bestandsnaam.Remove(lengte, 13);           // controllertype uit naam halen
            do
            {
                rij = file.ReadLine();
                if (rij != null)              //error op volgende lijn vermijden
                {
                    if (rij.StartsWith("0") || rij.StartsWith("1") || rij.StartsWith("2") || rij.StartsWith("3"))
                    {
                        rijcheck = true;
                    }

                    teller = teller + 1;
                    if (teller > 10)
                    {
                        if (rijcheck == true)           // rij is datumlijn
                        {
                            string[] split = rij.Split(' ');
                            foutinformatie[0, index] = type;                     //type ophalen
                            foutinformatie[3, index] = controller;              //controllernaam ophalen
                            foutinformatie[1, index] = split[0];                //datum ophalen
                            foutinformatie[2, index] = split[1];                //tijd ophalen 
                            foutinformatie[4, index] = split[2];                //foutcode ophalen
                            foutinformatie[5, index] = split[5];                //foutteller ophalen 
                            if (controller.StartsWith("MPU") == true)
                            {
                                lusarraygraad = 5;
                                while (lusarraygraad < 360)
                                {

                                    if (graadmpu[0, lusarraygraad] == split[2])
                                    {
                                        try
                                        {
                                            graad = graadmpu[1, lusarraygraad];
                                            foutinformatie[7, index] = graad;
                                        }
                                        catch
                                        {
                                        }
                                        lusarraygraad = lusarraygraad + 499;
                                        graadgevonden = true;
                                    }
                                    lusarraygraad = lusarraygraad + 1;
                                }
                                foutinformatie[7, index] = graad;
                                if (graadgevonden == false)
                                {
                                    foutinformatie[7, index] = "";
                                }
                                graadgevonden = false;
                            }

                            //////////////////////////////////////////////////////////////////////////
                            if (controller.StartsWith("AAUX") == true)
                            {
                                lusarraygraad = 4;
                                while (lusarraygraad < 30)
                                {

                                    if (graadaaux[0, lusarraygraad] == split[2])
                                    {
                                        try
                                        {
                                            graad = graadaaux[1, lusarraygraad].ToString();
                                            foutinformatie[7, index] = graad;
                                        }
                                        catch
                                        {
                                        }
                                        lusarraygraad = lusarraygraad + 499;
                                        graadgevonden = true;
                                    }
                                    lusarraygraad = lusarraygraad + 1;
                                }
                                foutinformatie[7, index] = graad;
                                if (graadgevonden == false)
                                {
                                    foutinformatie[7, index] = "";
                                }
                                graadgevonden = false;
                            }
                            if (controller.StartsWith("ACTRL") == true)
                            {
                                lusarraygraad = 6;
                                while (lusarraygraad < 85)
                                {

                                    if (graadactrl[0, lusarraygraad] == split[2])
                                    {
                                        try
                                        {
                                            graad = graadactrl[1, lusarraygraad].ToString();
                                            foutinformatie[7, index] = graad;
                                        }
                                        catch
                                        {
                                        }
                                        lusarraygraad = lusarraygraad + 499;
                                        graadgevonden = true;
                                    }
                                    lusarraygraad = lusarraygraad + 1;
                                }
                                foutinformatie[7, index] = graad;
                                if (graadgevonden == false)
                                {
                                    foutinformatie[7, index] = "";
                                }
                                graadgevonden = false;
                            }

                            try
                            {
                                telleromschrijving = 6;
                                informatie = "";
                                while (split[telleromschrijving] != " ")
                                {
                                    informatie = informatie + " " + split[telleromschrijving];
                                    telleromschrijving = telleromschrijving + 1;
                                }
                            }
                            catch
                            {
                                foutinformatie[6, index] = informatie;                //foutteller ophalen 
                            }
                            rijcheck = false;
                            rij = file.ReadLine();
                            while (varcheck < 40)
                            {
                                // rij met eerste variable

                                if (rij != "")
                                {
                                    variable[indexlokaal, varteller] = rij;
                                    foutinformatie[varteller + 8, index] = variable[indexlokaal, varteller] = rij;
                                    varteller = varteller + 1;
                                    rij = file.ReadLine();
                                }
                                else
                                {
                                    foutinformatie[varteller + 8, index] = " ";

                                    varteller = varteller + 1;
                                }
                                varcheck = varcheck + 1;
                            }
                            varcheck = 0;
                            varteller = 0;
                            indexlokaal = indexlokaal + 1;
                            index = index + 1;
                        }
                    }
                }
            }
            while (rij != null);
            file.Close();
            file.Dispose();
        }
4

3 に答える 3

2

682 はたまたまメモリ不足になったときの数字であり、特別な数字ではないと思います。ストリームリーダーをカプセル化する必要があります

using(StreamReader file = new System.IO.StreamReader(scanpad[lusteller]))
{
//do stuff
}

このようにして、ストリームリーダーは使用後に破棄され、メモリがクリアされます

更新のために編集

ストリームリーダー内にもあります

                        rij = file.ReadLine();
                        while (varcheck < 40)
                        {
                            // rij met eerste variable

                            if (rij != "")
                            {
                                variable[indexlokaal, varteller] = rij;
                                foutinformatie[varteller + 8, index] = variable[indexlokaal, varteller] = rij;
                                varteller = varteller + 1;
                                rij = file.ReadLine();
                            }

ただし、 http://msdn.microsoft.com/en-GB/library/system.io.streamreader.readline.aspxReadLineを見て、再び null を返す かどうかを確認していません

これにより、ストリームが null に達したにもかかわらず、引き続き続行しているため、メモリ不足の例外が発生する可能性があります。

于 2013-04-18T07:05:28.000 に答える
1

それはすべて、StreamReader で何をするかによって異なります。

まず最初にそれを破棄する必要がありますが、メモリが不足する前にGCが収集したため、それが問題だとは思いません(参照も保持していない限り)。

「ReadToEnd」のようなものを使用し、ファイルのコンテンツが大きい場合、作成された文字列でラージ オブジェクト ヒープにヒットします (部分文字列を作成してそれらを操作すると、さらに悪化する可能性があります)。しばらくすると、ヒープが断片化され、リクエストに十分な大きさのメモリ チャンクが見つからないため、メモリが不足します。

まあ、それは私の推測ですが、あなたのコードにはほとんど情報がありません。頑張ってください。

于 2013-04-18T07:12:26.433 に答える
0

使用してみてくださいUsing:(読み取り後に破棄されたメモリ)

using(System.IO.StreamReader file = new System.IO.StreamReader(scanpad[lusteller]))
        {

        }
于 2013-04-18T07:04:59.770 に答える