Loop loopt vast.

  • Onderwerp starter Onderwerp starter Icky
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

Icky

Gebruiker
Lid geworden
7 mei 2007
Berichten
67
Hallo,

Ik ben bezig met een programma dat berekeningen maakt met data uit een database.
De database bevat +/- 20.000 records.

Nu heb roep ik elke record apart aan uit de database met OLEDB. Dan gaan de berekeningen eroverheen, en voegt ze aan een andere database toe.

Dit heb ik in een loop gedaan, alleen hierdoor wordt het programma ontzettend traag. En kan ik pas verder gaan met het programma, als alle berekeningen over alle records gedaan zijn. Dus als het programma klaar is.

Is er iets, waardoor ik het programma wat meer rust kan geven, in plaats van een loop?

Groetjes,

Timo
 
Je kan ook je code optimaliseren of bepaalde berekeningen in je query oplossen of juist in code zetten of tussen oplossingen in tijdelijke tabellen opslaan.

Legio oplossingen dus.

Als je je code eens neerzet kunnen we eens kijken waar deze geoptimaliseerd kan worden.

Enjoy!
 
Code:
  Private Sub cmdStartCrawling_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdStartCrawling.Click
        If cmdStartCrawling.Text = "Start Crawling" Then
            Application.DoEvents()

            lblCrawlingStatus.Text = "Currently Crawling"
            lblCrawlingStatus.ForeColor = Green
            cmdStartCrawling.Text = "Stop Crawling"

            Dim Connection As New OleDb.OleDbConnection
            Connection.ConnectionString = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source = C:\database.mdb"

            Connection.Open()

            Dim myDataSet As New DataSet
            Dim myDataAdapter As OleDb.OleDbDataAdapter
            Dim sql As String

            sql = "SELECT * FROM uris"
            myDataAdapter = New OleDb.OleDbDataAdapter(sql, Connection)
            myDataAdapter.Fill(myDataSet, "uris")

            Dim myCommandBuilder As New OleDb.OleDbCommandBuilder(myDataAdapter)
            Dim myDataSetNewRow As DataRow

            myCommandBuilder.GetUpdateCommand()
            Dim i As Integer = 0

            While i < 10
                Dim CurrentURI As String = myDataSet.Tables("uris").Rows(i).Item(1)
                Dim CurrentSource As String = ""

                Try
                    CurrentSource = GetURL(CurrentURI)
                    lblCrawlingCurrentlyData.Text = CurrentURI



                Catch ex As Exception
                    MsgBox("Can't load Web page" & vbCrLf & ex.Message)
                End Try

                Dim MyHTMLURI As Match
                Dim myMatchesURI As MatchCollection
                Dim myRegexURI As New Regex( _
                                        "<A[^>]*?HREF\s*=\s*""([^""]+)""[^>]*?>([\s\S]*?)<\/A>", _
                                        RegexOptions.IgnoreCase)
                Dim myRegexURI2 As New Regex("href\s*=\s*(?:""(?<1>[^""]*)""|(?<1>\S+))", _
                                                RegexOptions.IgnoreCase Or RegexOptions.Compiled)
                Dim successfulMatchURI As Match

                myMatchesURI = myRegexURI.Matches(CurrentSource)
                Dim URISStolen As Integer = 0
                For Each successfulMatchURI In myMatchesURI
                    MyHTMLURI = myRegexURI2.Match(successfulMatchURI.Value)
                    Dim HTMLURIRemove As String
                    HTMLURIRemove = MyHTMLURI.ToString.Remove(0, 6)
                    HTMLURIRemove = HTMLURIRemove.Remove(HTMLURIRemove.Length - 1, 1)
                    If HTMLURIRemove.StartsWith("http://") Then
                        myDataSetNewRow = myDataSet.Tables("uris").NewRow
                        If HTMLURIRemove.Length > 255 Then

                            HTMLURIRemove = HTMLURIRemove.Remove(250, HTMLURIRemove.Length - 250)
                        End If

                        If CurrentURI.Length > 255 Then

                            CurrentURI.Remove(250, CurrentURI.Length - 200)
                        End If



                        myDataSetNewRow.Item("uri") = HTMLURIRemove
                        myDataSetNewRow.Item("parentPage") = CurrentURI
                        myDataSetNewRow.Item("dateAdded") = My.Computer.Clock.LocalTime
                        myDataSet.Tables("uris").Rows.Add(myDataSetNewRow)
                        myDataAdapter.Update(myDataSet, "uris")
                        URISStolen = URISStolen + 1
                        lblCrawlingUriData.Text = URISStolen.ToString
                    Else
                    End If
                Next
                i = i + 1
            End While

            Connection.Close()

        Else
            lblCrawlingStatus.Text = "Currently Not Crawling"
            lblCrawlingStatus.ForeColor = Red
            cmdStartCrawling.Text = "Start Crawling"
        End If

    End Sub

Dit is mijn code. Zonder de toevoeging van doevents
 
imho

Eerlijkheid gebied me te zeggen dat ik weinig ervaring heb op het gebied van VB.NET.

Ik zou alle dim statements uit je loop halen maar misschien maakt dat niet uit.
Ik zou een recordset gebruiken waar je doorheen loopt. Het lijkt erop dat je van een tabel iedere keer het volgende record pakt. Dit betekend op het moment dat je een record toevoegt, wat je verderop ook doet, dat je die records later ook weer selecteert. Is dat de bedoeling?

Verder kan je op bepaalde plekken de tijd naar je immediate window wegschrijven zodat je kan zien hoelang bepaalde statements duren. Maar wellicht zit daar een standaard functionaliteit in VB.NET ingebouwd die dat voor je in de gaten kan houden?

Succes!
 
Eerlijkheid gebied me te zeggen dat ik weinig ervaring heb op het gebied van VB.NET.

Ik zou alle dim statements uit je loop halen maar misschien maakt dat niet uit.
Ik zou een recordset gebruiken waar je doorheen loopt. Het lijkt erop dat je van een tabel iedere keer het volgende record pakt. Dit betekend op het moment dat je een record toevoegt, wat je verderop ook doet, dat je die records later ook weer selecteert. Is dat de bedoeling?

Verder kan je op bepaalde plekken de tijd naar je immediate window wegschrijven zodat je kan zien hoelang bepaalde statements duren. Maar wellicht zit daar een standaard functionaliteit in VB.NET ingebouwd die dat voor je in de gaten kan houden?

Succes!

Ik heb de dims nu aan het begin staan, maar dat maakt ook niet uit.
Het is de bedoeling dat die later ook weer gepakt worden, in feite is het een oneidige loop dus. Die dmv een knop uitgeschakeld kan worden.

Als ik de loop maar 1 keer uitvoer, dan werkt het gewoon prima.

While i < 1
 
Heb je doevents al toegepast?

Is het een oneindige lus? Omdat je schrijft:
in feite is het een oneidige loop dus. Die dmv een knop uitgeschakeld kan worden
Voor die knop heb ik geen code gezien. Of is die knop een combinatie van twee? Control-Break? of Drie? Control-Alt-Delete?
 
Heb je doevents al toegepast?

Is het een oneindige lus? Omdat je schrijft:
Voor die knop heb ik geen code gezien. Of is die knop een combinatie van twee? Control-Break? of Drie? Control-Alt-Delete?

Die knop staat er nog niet bij, ik wilde eerst even de loop uberhaupt laten werken.
Ik heb de Doevents nog niet toegevoegd, ben eerst de MSDN library aan het doorspitten, hoe het precies werkt.
 
Ooh, ik heb gewoon Application.DoEvents() in de while gezet.

Nu werkt hij perfect, ontzettend bedankt =)

Ik las alleen dat het niet zo'n 'nette' manier was om dit soort problemen op te lossen, weet iemand daar wat van?
 
Er is geen andere manier om tijdelijk de CPU de gelegenheid te geven andere events af te vangen. Ik weet niet of VB.NET met threads overweg kan. In een andere thread zou je zoiets kunnen programmeren. Ben blij dat het nu werkt.
 
@ Guus2005

Ik weet niet of VB.NET met threads overweg kan

In VB kan je idd op verschillende threads werken, maar is voor mij te veel werk om
dat uit te pluizen. Voor meer info over multithreading operaties in VB, verwijs ik je
gemakkelijkheidshalve door naar de MSDN library!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan