Avatar billede mmbn Nybegynder
08. juli 2005 - 10:43 Der er 7 kommentarer og
1 løsning

optimering dataset eller oracledatareader

jeg har en metode:

private void finalWrite(OracleCommand cmd,string tableTitle)
        {
            tableNameStr = tableTitle;
            logTime = DateTime.Now.ToString();
            builder = new StringBuilder();
            int count=0;
            string manipulate="";
            int size = 0;
            int diff=0;
            try
            {
                if(oraConn.State != ConnectionState.Open)
                {
                    open();
                }
                OracleDataReader oReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                for(int i=0;i<dataSetDef.Tables[0].Rows.Count;i++)
                {
                    long tmp = 0;
                    tmp = GC.GetTotalMemory(false);
                    System.Diagnostics.Debug.Write("mem: " + tmp);
                    if(tableTitle.Equals(dataSetDef.Tables[0].Rows[i]["TABELTITEL"].ToString()))
                    {
                        while(oReader.Read())
                        {
                            while(count < oReader.FieldCount)
                            {
                                if(count == 0)
                                {
                                    size = int.Parse(dataSetDef.Tables[0].Rows[i+count]["LENGTH"].ToString());
                                    manipulate = oReader.GetValue(count).ToString();
                                    manipulate = convertToLatinAndRemove(manipulate);
                                    diff = (size-manipulate.Length);
                                    if(diff != 0)
                                    {
                                        manipulate = manipulate.PadLeft(size,'0');
                                        diff=0;
                                        builder.Append(manipulate);
                                        manipulate="";
                                        count++;
                                    }
                                    else
                                    {
                                        builder.Append(manipulate);
                                        manipulate="";
                                        count++;
                                    }
                                }
                                else
                                {
                                    if(count > 0)
                                    {
                                        if(dataSetDef.Tables[0].Rows[i+count]["DATATYPE"].ToString().Equals("DATE"))
                                        {
                                            dateSplit = oReader.GetValue(count).ToString();
                                            manipulate = dateSetup(dateSplit);
                                            builder.Append(manipulate);
                                            manipulate="";
                                            count++;
                                        }
                                        else
                                        {
                                            if(!(size.ToString().Equals(dataSetDef.Tables[0].Rows[count]["LENGTH"].ToString())))
                                            {
                                                size = int.Parse(dataSetDef.Tables[0].Rows[i+count]["LENGTH"].ToString());
                                            }
                                            if(size > 2048)
                                            {
                                                manipulate = oReader.GetValue(count).ToString();
                                                manipulate = convertToLatinAndRemove(manipulate);
                                                if(manipulate.Length > 2048)
                                                {
                                                    //System.Diagnostics.Debug.WriteLine(manipulate.Length);
                                                    manipulate = truncate(manipulate);
                                                    char[] split = new char[] {';'};
                                                    foreach(string newStr in manipulate.Split(split))
                                                    {
                                                        if(newStr.Length == 2048)
                                                        {
                                                            builder.Append(newStr);
                                                        }
                                                        else
                                                        {
                                                            size = newStr.Length;
                                                            builder.Append(newStr);
                                                        }
                                                    }
                                                    //builder.Append(manipulate);
                                                    //System.Diagnostics.Debug.WriteLine(manipulate.Length);
                                                    manipulate ="";
                                                    count++;
                                                }
                                                else
                                                {
                                                    manipulate = manipulate.PadRight(size,' ');
                                                    builder.Append(manipulate);
                                                    manipulate = "";
                                                    count++;
                                                }
                                            }
                                            if(size <= 2048)
                                            {
                                                manipulate = oReader.GetValue(count).ToString();
                                                manipulate = convertToLatinAndRemove(manipulate);
                                                diff = (size-manipulate.Length);
                                                if(diff != 0)
                                                {
                                                    manipulate = manipulate.PadRight(size,' ');
                                                    diff = 0;
                                                    builder.Append(manipulate);
                                                    manipulate = "";
                                                    count++;
                                                }
                                                else
                                                {
                                                    builder.Append(manipulate);
                                                    manipulate="";
                                                    count++;
                                                }
                                                if(count == oReader.FieldCount)
                                                {
                                                    count = 0;
                                                    break;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                oReader.Dispose();
                removeSpecialChar(builder);
            }

der skal gøre en masse med de opslysningerne den får. tabletitle parameteren fortæller hvilken tabel vi befinder os i. cmd fås som select * from tabeltitle. er der nogen måde at optimere hukommelses forbruget, eventuelt ved at bruge dataset? og i hvis det er tilfældet hvordan? det er store databaser jeg arbejder op imod (>25gb).
Avatar billede imago-dei Nybegynder
08. juli 2005 - 10:56 #1
Lidt svært at overskue hvad din metode gør. Men jeg kan se at du bruger både et dataset og en datareader. Er det nødvendigt?

Et dataset er betydeligt langsommere end en datareader ved store datamængder. Så hvis du kan nøjes med en datareader så brug udelukkende den.
Avatar billede mmbn Nybegynder
08. juli 2005 - 11:00 #2
datasettet indeholder oplysningerne om databasen (tabeltitler,definitioner ol) bruger den til at finde det rigtige sted i databasen. readeren indeholder selve informationerne. eks. reader  = select * from, dataset = "SELECT table_name TabelTitel, "+
                "comments TabelInfo "+
                "FROM user_tab_comments where table_type = 'TABLE'"+
                "AND comments LIKE '%+%'";

ville det være hurtigere at fylde et dataset med de informationer readeren får?
Avatar billede mmbn Nybegynder
08. juli 2005 - 11:06 #3
eller er der noge måde hvorpå man kan mindske datareaderens hukommelses forbrug? eksvis ved GC.Collect eller lignende?
Avatar billede imago-dei Nybegynder
08. juli 2005 - 11:07 #4
Det kommer lidt an på hvad du vil gøre med de oplysninger, som datareaderen kommer med.

Et lidt forenklet svar er at hvis du ikke skal genbruge oplysningerne, i forskellig rækkefølge, så får du et vældigt overhead ved at bruge et dataset til oplysningerne.

Hvis du er nødt til at bruge et dataset, så får du et dataset leveret fra databasen. Du skal ikke bruge en datareader til at fylde datasettet. Det ville være en dyr omvej.
Avatar billede imago-dei Nybegynder
08. juli 2005 - 11:08 #5
Datareaderens hukommelsesforbrug er, mig vidende, minimal. Den er langt, langt, langt under hvad datasettet bruger.
Avatar billede mmbn Nybegynder
08. juli 2005 - 11:20 #6
hvis jeg gennemløber store tabeller får jeg systemoutofmemoryexception med readeren.en beskrivelse af hvad det er der sker at at jeg skal trække alle oplysningerne ud af en database og derefter skrive indholdet til en .ark fil specifikt kolonneformat. eks hvis du har en tabel:
navn  |cprnummer
mikkel |111111-1111
ib    |222222-22
og de begge er eksvis varchar 50 så skal der i arkfilen skrives:
00000000000000000000000000000000000000000000mikkel111111-1111
000000000000000000000000000000000000000000000000ib222222-2222
disse skal skrive på en lang linie og have (i dette tilfælde) 42 blanktegn imellem hver record.
Avatar billede imago-dei Nybegynder
08. juli 2005 - 11:40 #7
JEg kan ikke forstå at du får system out of memory. Så kan desværre ikke hjælpe. Men du kan evt. prøve at kopiere fejlbeskeden ind her. Eller søge på fejlen på google.
Avatar billede mmbn Nybegynder
12. juli 2005 - 08:11 #8
lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester