Avatar billede moba Nybegynder
02. april 2007 - 14:20 Der er 12 kommentarer og
1 løsning

Optimering af kode

Hej
Jeg mangler forslag til hvordan nedenstående kode (generering af tilfældige tal til en tabel)kan optimeres.
Koden afvikles meget langsomt, hvis jeg som input vælger ex. 100.000 tal.
For at køre koden skal der oprettes en tabel "tblrndnr"  med 2 felter (long integer) recnr, randomnr.

smide nedenstående i et modul, og kør funktionen "start" fra en makro

Option Compare Database

Public Function RandomNumbers(Oevre As Long, _
  Optional Nedre As Long = 1, _
  Optional HvorMangeTal As Long = 1, _
  Optional Unik As Boolean = True)
 
    If HvorMangeTal > ((Oevre + 1) - (Nedre - 1)) Then Exit Function
    Dim x          As Long
    Dim n          As Long
    Dim colNumbers  As New Collection
    Dim taeller    As Long
   
    taeller = 1
    DoCmd.SetWarnings False
       
    With colNumbers
        For x = Nedre To Oevre
            .Add x
        Next x
        For x = 0 To HvorMangeTal - 1
            n = RandomNumber(0, colNumbers.count + 1)
            DoCmd.RunSQL "INSERT INTO tblrndnr ( Recnr, Randomnr ) SELECT '" & taeller & "','" & colNumbers(n) & "' "
            taeller = taeller + 1
            If Unik Then
                colNumbers.Remove n
            End If
        Next x
    End With
   
    DoCmd.SetWarnings True
    Set colNumbers = Nothing
 
End Function


Public Function RandomNumber(Oevre As Long, _
    Nedre As Long) As Long
   
    Randomize
    RandomNumber = Int((Oevre - Nedre + 1) * rnd + Nedre)
End Function



Public Function start()
Dim Oevre As Long
Dim Nedre As Long
Dim antaltal As Long
Dim svar As String
Dim taeller As String

'tabellen tømmes for records
sletposter


Oevre = InputBox("Indtast øvre grænse")
Nedre = InputBox("Indtast nedre grænse")
antaltal = InputBox("Hvor mange tal skal findes")
   
    If Oevre - Nedre + 1 < antaltal Then
        MsgBox ("Antal tal skal være lig med eller mindre end difference mellem øvre og nedre grænse")
        Exit Function
    End If

x = RandomNumbers(Oevre, Nedre, antaltal)

svar = MsgBox("Programmet er afviklet, og resultatet er skrevet til tabellen tblrndnr. Vil du åbne tabellen?", vbOKCancel)
    If svar = vbOK Then
        DoCmd.OpenTable "tblrndnr"
    End If

End Function

Public Function sletposter()
DoCmd.SetWarnings False
DoCmd.OpenQuery "qrydelete"
DoCmd.SetWarnings True
End Function
Avatar billede terry Ekspert
02. april 2007 - 19:39 #1
What do you want to generate 100,000 random numbers for?
Avatar billede moba Nybegynder
02. april 2007 - 21:41 #2
I have a specific purpose, unfortunatly I cant get into details at this moment.
Avatar billede terry Ekspert
03. april 2007 - 08:26 #3
I was just wondering if it was really necessary, maybe another idea would do.
It is going to take some time to INSERT 100,000 records into a table.

Try making a very simple loop and see how long this takes compared to how long it takes when finding the random numbers. This will give you an idea s to what is taking so long.

(NOT TESTED)
Dim i as long
Dim taeller    As Long

For i = 1 to 100000


DoCmd.RunSQL "INSERT INTO tblrndnr ( Recnr, Randomnr ) VALUES ('" & taeller & "', '" & i & "')"


Next i
Avatar billede terry Ekspert
03. april 2007 - 09:56 #4
Avatar billede moba Nybegynder
03. april 2007 - 10:27 #5
Hej Terry
Det er helt sikkert  "insert into" der tager tid. Jeg havde først designet programmet til at skrive tallene til et array - tog ingen tid!
Avatar billede moba Nybegynder
03. april 2007 - 10:31 #6
Måske det var muligt, at skrive arrayet ud til en cvs fil?
Avatar billede neoman Novice
03. april 2007 - 11:18 #7
Hej Moba - og din Insert fungerer sådan som du har skrevet den ? "INSERT ....SELECT ..." ?? :)
Avatar billede moba Nybegynder
03. april 2007 - 11:47 #8
Ja den fungere fint. Men tager adkillige minutter at afvikle ved +100k tal, men ikke nær så lang tid hvis data skrives til et array.
Avatar billede terry Ekspert
05. april 2007 - 17:00 #9
Heres a link which should show you how to wriet an array to a csv file
http://forums.techguy.org/development/365467-open-write-array-excel.html
Avatar billede terry Ekspert
25. april 2007 - 18:00 #11
status moba?
Avatar billede moba Nybegynder
25. april 2007 - 20:19 #12
tak for gode tips
Avatar billede terry Ekspert
25. april 2007 - 20:41 #13
selv tak, hope you got something to work
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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