Avatar billede freos Nybegynder
16. november 2005 - 14:20 Der er 13 kommentarer

hjælp med listview

Hej Eksperter.

Jeg sidder og er igang med at lave et program der skal bruges til at indlæse data fra en ISA 2004 logfil.

Jeg få da også lagt al dataen ind i en ArrayList hvorefter at jeg deler al dataen op og ligger det ned i et 2 dimisionelt array.

Den data som jeg har smidt ned et mit array bliver så filteret alt efter om action er "Allowed" eller "Denied". Imens at det bliver filteret bliver det smidt ned i 2 ListViews.

Mit problem er så at når jeg smider dataen ned i et ListView så tager det ca. 7 min før at den er færdig med at ligge alt ned i den.

Nogen der har en idé om hvorfor den er så lang tid om den lille del?

Min kode som smider det ned i ListViewet:

if (sentences[b][i-2].ToString() == "Allowed")
                        {
                            ListViewItem lvi = new ListViewItem(sentences[b][3]);
                            for (int a = 4; a < sentences[b].Length; a++)
                            {
                                lvi.SubItems.Add(sentences[b][a]);
                            }
                            lw_allowed.Items.Add(lvi);
                        }

Mvh.

Freos
Avatar billede lifo Nybegynder
16. november 2005 - 15:23 #1
har ud sortering på listView'et ?
det kan sløve det mega meget mens du indsætter
Avatar billede freos Nybegynder
16. november 2005 - 15:34 #2
Jeg har prøvet at udkommentere min if sætning og det tager stadigvæk den samme tid om den er med eller ej.
Avatar billede nielle Nybegynder
16. november 2005 - 18:21 #3
Så må problemet jo snare være i den løkke som ligger uden om.
Avatar billede freos Nybegynder
17. november 2005 - 10:38 #4
Her er den kode som bliver brugt til fra du trykker på OK til at åbne en fil til den er færdig med indlæsningen.

if( openFileDialog1.ShowDialog() == DialogResult.OK )
{
    btn_open.Hide();
    btn_clear.Show();

    filename = openFileDialog1.FileName.Split('\\');
    lbl_file.Text = filename.GetValue(filename.Length-1).ToString();

    StreamReader sr = new StreamReader(File.OpenRead(lbl_file.Text));

    while (sr.Peek() != -1)
    {
        dump = sr.ReadLine();
   
        if (Regex.IsMatch(dump,"anonymous"))
        {}
        else
        {
            if (Regex.IsMatch(dump,"#") || Regex.IsMatch(dump,OpenDir.MIME_Type.ToString()))
            {
                myAL.Add(dump);
            }
        }
    }

    sr.Close();

    user = new string [myAL.Count];
    sentences = new string[myAL.Count][];

    while (b < myAL.Count)
    {
        for(ix = 0; ix < myAL.Count; ix++)
        {
            st = (string)myAL[ix];
            sentences[ix] = st.Split(null);
        }

        lbl_date.Text = sentences[2][1].ToString();
           
        if (columns == 0)
        {
            for (i = 1; i < sentences[3].Length; i++)
            {
                if (sentences[3][i].ToString() == "c-ip" || sentences[3][i].ToString() == "cs-username" || sentences[3][i].ToString() == "date" || sentences[3][i].ToString() == "cs-mime-type" || sentences[3][i].ToString() == "action")
                {}
                else
                {
                    lw_allowed.Columns.Add(sentences[3][i].ToString(), lw_allowed.Width/5-4, HorizontalAlignment.Left);
                    lw_denied.Columns.Add(sentences[3][i].ToString(), lw_allowed.Width/5-4, HorizontalAlignment.Left);
                }
            }
            columns = 1;
        }
        else
        {
            if (sentences[b][i-2].ToString() == "Allowed")
            {
                ListViewItem lvi = new ListViewItem(sentences[b][3]);
                for (int a = 4; a < sentences[b].Length; a++)
                {
                    lvi.SubItems.Add(sentences[b][a]);
                }
                lw_allowed.Items.Add(lvi);
            }

            /*if (sentences[b][i-2].ToString() == "Denied")
            {
                ListViewItem lvi = new ListViewItem(sentences[b][3]);
                for (int a = 4; a < sentences[b].Length; a++)
                {
                    lvi.SubItems.Add(sentences[b][a]);
                }
                lw_denied.Items.Add(lvi);
            }

            for (int ic = 0; ic <= Count-1; ic++)
            {
                if (Count == 0)
                    isSet = 0;
                else if (user[ic].ToString() == sentences[b][1].ToString())
                {
                    isSet = 1;
                }
            }

            if (isSet != 1)
            {
                user[Count] = sentences[b][1].ToString();
                username = sentences[b][1].Split('\\');
                cb_user.Items.Add(username[1].ToString());
                            Count++;
                isSet = 0;
            }
            isSet = 0;*/
        }
        b++;
    }
}
Avatar billede nielle Nybegynder
17. november 2005 - 18:13 #5
1) Hvor mange linjer er din log-fil på? En meget stor fil vil alt andet lige tage længere tid, og måske er 7 minutter bare den tid det nødvendigvis tager...

2) Denne kode-blok:

while (sr.Peek() != -1)
{
    dump = sr.ReadLine();
    if (Regex.IsMatch(dump,"anonymous"))
    {}
    else
    {
        if (Regex.IsMatch(dump, "#") || Regex.IsMatch(dump, OpenDir.MIME_Type.ToString()))
        {
            myAL.Add(dump);
        }
    }
}

- kan meget mere effektivt skrives som:

string odm = OpenDir.MIME_Type.ToString();
while ((dump = sr.ReadLine() != null)
{
    if (dump.IndexOf("anonymous") == -1)
    {
        if (dump.IndexOf("#") != -1 || dump.IndexOf(odm) != -1)
        {
            myAL.Add(dump);
        }
    }
}

3) Tager din kode også 7 minutter, hvis du inkludere denne kode-blok:

if (sentences[b][i-2].ToString() == "Allowed") ...

- i din udkommentering?

4) Til sidst et godt råd: Du burde overveje seriøst om ikke du skulle definere dine variable der hvor du bruger dem. Lige nu bruger din kode dusinvis af variable, som må være defineret et helt andet sted. Det gør det svært at overskue koden, og det giver massere af muligheder for at der er indsniger sig fejl af den vej.
Avatar billede freos Nybegynder
18. november 2005 - 08:31 #6
1. Den logfil som tager 7 min at indlæse ind i mit listview er på ca. 36000 linier
3. Ja den tager stadigvæk 77 min hvis den if sætning er udkommenteret.
Avatar billede freos Nybegynder
18. november 2005 - 08:33 #7
Har prøvet at smide indholdet over i en richtextbox og der taget det ca. 30 sec at få at indholdet smidt ind i.
Avatar billede nielle Nybegynder
19. november 2005 - 09:09 #8
Har du afprøvet 2) endnu? Din brug af Regex er bestemt kke specielt økonomisk.
Avatar billede freos Nybegynder
21. november 2005 - 13:44 #9
Af hvad jeg kan se efter at have prøvet nummer 2, så hjælper det ikke særlig meget.
Avatar billede nielle Nybegynder
21. november 2005 - 17:41 #10
Hvordan ser din kode ud nu?
Avatar billede freos Nybegynder
24. november 2005 - 09:46 #11
private void btn_open_Click(object sender, System.EventArgs e)
{
    Log_Parser_Options.Options OpenDir = new Log_Parser_Options.Options();

    this.openFileDialog1.Filter = "W3C extended log file format(*.w3c)|*.w3c|ISA Server File Format (*.iis)|*.iis";
    this.openFileDialog1.InitialDirectory = @OpenDir.Directory.ToString();

    if( openFileDialog1.ShowDialog() == DialogResult.OK )
    {
        btn_open.Hide();
        btn_clear.Show();
        filename = openFileDialog1.FileName.Split('\\');
        lbl_file.Text = filename.GetValue(filename.Length-1).ToString();

        StreamReader sr = new StreamReader(openFileDialog1.FileName.ToString());

        string odm = OpenDir.MIME_Type.ToString();
        while ((dump = sr.ReadLine()) != null)
        {
            if (dump.IndexOf("anonymous") == -1)
            {
                if (dump.IndexOf("#") != -1 || dump.IndexOf(odm) != -1)
                {
                    myAL.Add(dump);
                }
            }
        }

        sentences = new string [myAL.Count][];
        user = new string [myAL.Count];

        DateTime start = DateTime.Now;
        textBox1.Text = start.ToString();

        while (b < myAL.Count)
        {
            for(ix = 0; ix < myAL.Count; ix++)
            {
                st = (string)myAL[ix];
                sentences[ix] = st.Split(null);
            }

            lbl_date.Text = sentences[2][1].ToString();
   
            if (columns == 0)
            {
                for (i = 1; i < sentences[3].Length; i++)
                {
                    if (sentences[3][i].ToString() == "c-ip" || sentences[3][i].ToString() == "cs-username" || sentences[3][i].ToString() == "date" || sentences[3][i].ToString() == "cs-mime-type" || sentences[3][i].ToString() == "action")
                    {}
                    else
                    {
                        lw_allowed.Columns.Add(sentences[3][i].ToString(), lw_allowed.Width/5-4, HorizontalAlignment.Left);
                        lw_denied.Columns.Add(sentences[3][i].ToString(), lw_allowed.Width/5-4, HorizontalAlignment.Left);
                    }
                }
                columns = 1;
            }
            else
            {
                if (sentences[b][i-2].ToString() == "Allowed")
                {
                    ListViewItem lvi = new ListViewItem(sentences[b][3]);
                    for (int a = 4; a < sentences[b].Length; a++)
                    {
                        lvi.SubItems.Add(sentences[b][a]);
                    }
                    lw_allowed.Items.Add(lvi);
                }

                /*if (sentences[b][i-2].ToString() == "Denied")
                {
                    ListViewItem lvi = new ListViewItem(sentences[b][3]);
                    for (int a = 4; a < sentences[b].Length; a++)
                    {
                        lvi.SubItems.Add(sentences[b][a]);
                    }
                    lw_denied.Items.Add(lvi);
                }

                for (int ic = 0; ic <= Count-1; ic++)
                {
                    if (Count == 0)
                        isSet = 0;
                    else if (user[ic].ToString() == sentences[b][1].ToString())
                        isSet = 1;
                }

                if (isSet != 1)
                {
                    user[Count] = sentences[b][1].ToString();
                    username = sentences[b][1].Split('\\');
                    cb_user.Items.Add(username[1].ToString());
                    Count++;
                    isSet = 0;
                }
                isSet = 0;*/
            }
            b++;
        }
        DateTime end = DateTime.Now;
        textBox2.Text = end.ToString();
    }
}
Avatar billede nielle Nybegynder
24. november 2005 - 18:11 #12
1) Din kode er ikke specielt let at læse. F.eks. bruger du variablen b i:

while (b < myAL.Count)

- uden at den er defineret, og initialiseret, noget sted i den vise kode. Den må altså være defineret et helt andet sted og det er derfor også uklart hvad den starter på (selv om jeg gætter på værdien 0).

På samme måde bruger du i'et i:

if (sentences[b][i-2].ToString() == "Allowed")

Du har godt nok også en for-løkke som gør noget med denne på et tidligere tidspunkt, men rent strukturmæssigt er det ikke pænt at gøre det på den måde.

I OOP er det en gylden regel at man bør prøve at begrænse antallet af globalt definerede variable til et minimum.


2) Du har en hovedløkke:

while (b < myAL.Count)
{
    ...
}

- og inden i den laver du en masse udregninger som ikke afhænger af b. Et godt eksempel er f.eks. din allerførste for-løkke:

while (b < myAL.Count)
{
    for(ix = 0; ix < myAL.Count; ix++)
    {
        st = (string)myAL[ix];
        sentences[ix] = st.Split(null);
    }

    ...
}

Der er ingen grund til at gentage denne for-løkke en gang for hver while-gennemløb, og den bør derfor trækkes udenfor. Hvis du gør dette for alle tilsvarende konstruktioner, vil du sikkert få et gevaldigt hastighedsløft bare der!


3) Hvis du derefter stadig oplever problemer, så prøv at kommentere mere og mere af din kode ud, indtil at du har fundet ud af hvad det er der virkeligt trækker tænder ud.
Avatar billede nielle Nybegynder
08. december 2005 - 22:42 #13
Hallo?
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