Avatar billede slapstick Nybegynder
14. november 2003 - 14:12 Der er 10 kommentarer og
1 løsning

problem med optimering

jeg har et msflexgrid
og der putter jeg poster ind i ud fra en tekstfil
og det går sådanset os fint
MEN
meningen er at det skal kunne håndtere tekstfiler med 10.000 linier og opefter
problemet er bare at det går hulens langsomt
så mit spørgsmål er om der er nogen der har nogle gode optimeringsideer

koden kommer her:

Public Sub ReadFile()

    skod = "achoo"
    ColNumber = 1
    RowNumber = 2
    'Form1.flxGrid.Redraw = False
   
    Open Form1.txtFileToOpen.Text For Input As #1
   
        Do While EOF(1) = False
           
            ReDim Preserve ContentLine(p + 1)
                           
                Line Input #1, ContentLine(p)
           
                Call ProcessLine(ContentLine(p))
           
                p = p + 1
           
        Loop
       
    Close #1
   
    Form1.flxGrid.Redraw = True
   
    'MsgBox (line)
    'Call ProcessContent

End Sub

Public Sub ProcessLine(Line As String)
       
        ContentArr = Split(Line, Form1.ComboChooseDelimiter.Text)

        If Form1.flxGrid.Rows = RowNumber Then Form1.flxGrid.Rows = Form1.flxGrid.Rows + 1
       
        Form1.flxGrid.Row = RowNumber
        Form1.flxGrid.Col = 0
        Form1.flxGrid.Text = RowNumber - 1
        Form1.flxGrid.CellForeColor = RGB(0, 0, 255)
        Form1.flxGrid.CellAlignment = 1
       
            ArrayCount = UBound(ContentArr()) + 1
           
            Form1.flxGrid.Cols = UBound(ContentArr()) + 2
       
            If ArrayCount <= 8 And skod = "achoo" Then
               
                Form1.flxGrid.Rows = Form1.flxGrid.Rows + 1
                crap = ArrayCount * 1035
                lort = Form1.flxGrid.Width - crap
               
            End If
       
        For ContentCount = 0 To UBound(ContentArr())
               
            Form1.flxGrid.Col = ColNumber
            Form1.flxGrid.Text = ContentArr(ContentCount)
           
            If ArrayCount <= 8 And ContentCount = UBound(ContentArr()) Then
           
                Form1.flxGrid.ColWidth(Form1.flxGrid.Col) = lort - 100
               
            End If
           
            Form1.flxGrid.Row = 0
           
            If Form1.flxGrid.Text = "" Then
           
                Form1.flxGrid.Text = "Ingen"
                Form1.flxGrid.Row = 1
                Form1.flxGrid.Text = "Ingen"
                Form1.flxGrid.CellForeColor = RGB(0, 0, 255)
               
                Form1.flxGrid.Row = RowNumber
               
            Else
           
                Form1.flxGrid.Row = RowNumber
               
            End If
               
           
            ColNumber = ColNumber + 1
           
        Next
       
        skod = "lort"
       
        ColNumber = 1
       
        RowNumber = RowNumber + 1
       
End Sub
Avatar billede joern Nybegynder
14. november 2003 - 19:38 #1
Hej.

Jeg har ikke dyrket din kode, men jeg kender et lignende problem fra gennemløb af listebokse.  Dette skyldes at windows 'udglatter' alle skrå linier i tegnene.
Det med listebokse har jeg løst ved at gøre listen usynlig mens den gennemløbes.

Prøv at sætte flxgrid.visible = false indtil indlæsning er færdig og så sæt visible til true.

M.v.h. Jørn
Avatar billede slapstick Nybegynder
15. november 2003 - 16:39 #2
det har jeg prøvet :/
os prøvet at slå redraw fra så den først opdaterer mit flexgrid når den er færdig
men den sovser stadigvæk i et par minutter
og jeg ved den slags kan gøres hurtigere
ved ik om man kan få alt indhold i en .txt i et hug istedet for linie efter linie ligesom jeg gør der
Avatar billede joern Nybegynder
15. november 2003 - 16:53 #3
Hej.

Du kan godt læse en ascii-fil i ét hug, men kan du derpå bruge den til dit formål?

Open labjourfil.Caption For Input As #1
  txtjour.Text = Input(FileLen(labjourfil.Caption), 1)
Close #1

I øvrigt tror jeg den gradvise øgning af griddens størrelse er en mulig forsinkelse.  Form1.flxGrid.Cols = UBound(ContentArr()) + 2

Du kunne gennemlæse tekstfilen først og finde antal linier, sætte griddens størrelse og derpå læse filen igen og indsætte indholdet.

M.v.h.  Jørn
Avatar billede slapstick Nybegynder
17. november 2003 - 10:06 #4
ok det må jeg prøve
du har ikke en ide til hvordan man finder antal linier uden at løbe hele filen igennem? for det koster nemlig dyrt hvis man skal køre den igennem 2 gange
Avatar billede slapstick Nybegynder
17. november 2003 - 11:18 #5
ok det endte med jeg gjorde sådan her

Open Form1.txtFileToOpen.Text For Input As #1

        LinesFromFile = StrConv(InputB(LOF(1), 1), vbUnicode)
       
    Close #1
   
    lArr = Split(LinesFromFile, vbCrLf)
   
    Form1.flxGrid.Rows = UBound(lArr) + 3

men når min tekstfil er på de der 10000 linier så får jeg en runtime fejl der siger "unable to allocate memory to flexgrid" ved den her linie    Form1.flxGrid.Rows = UBound(lArr) + 3
Avatar billede joern Nybegynder
17. november 2003 - 11:36 #6
Tak for point, men problemet synes jo ikke løst.

Spørgsmål:  Er det virkelig nødvendigt at indlæse så mange linier samtidig?  En bruger kan jo umuligt overskue dem alligevel.  Kunne der ikke foreteges en udvælgelse efter brugerens forespørgsel?

At læse en tekstfil og tælle linier tager nu ikke lang tid, jeg har en på 7000 linier og den læses hurtigere en du kan sige 'slapstick sover', - med en 1,3 Ghz CPU og 512 MB ram.

Jeg skriver meget konservativ kode:
Dim a as Long, linie as String

a = 0
Open form1.txtfiletoopen.text for input as #1
  Do while EOF(1) = False
    Line Input #1, linie
    a = a +1
  Loop
Close #1

a indeholder jo så antal linier

En almindelig listeboks i VB5 kan højst indeholde 64.000 tegn, måske er der i MSFlexGrid en lignende begrænsning.  Hvis der ellers mangler ram skulle swapfilen jo tage over.

M.v.h.  Jørn
Avatar billede slapstick Nybegynder
17. november 2003 - 11:48 #7
det formål det skal bruges til kan der sagtens forkomme filer med over 30000 linier så det er lidt noget sovs hvis flexgrid har en sådan begrænsning
men det underlige er at hvis jeg løber tekstfilen igennem linie for linie og tilføjer rækker efterhånden som de skal bruges så er det ikke noget problem at lave 10000 rækker
men hvis jeg siger fra starten af at jeg vil ha den på 10000 rækker så får jeg den memory fejl
Avatar billede slapstick Nybegynder
17. november 2003 - 11:49 #8
grunden til at alle linier skal med er fordi det er statistik filer der skal indlæses og de vil  tit være på det antal linier og allesammen skal bruges
så jeg har ikke så meget valg :/
Avatar billede slapstick Nybegynder
17. november 2003 - 12:24 #9
nå jeg fandt ud af hvorfor
i et msflexgrid er der en begrænsning på 350000 celler
hvis man skal bruge flere så skal man vælge et mshflexgrid

http://support.microsoft.com/default.aspx?kbid=191006
Avatar billede joern Nybegynder
17. november 2003 - 12:51 #10
Hej.

Fint at du uddyber spørgsmålet.  Men jeg synes stadig at en statistik med forskellige optællinger må kunne udføres uden at alle data befinder sig indlæst i en grid.  Har du virkelig tænkt i alternative løsninger? og fundet at ingen er egnet.

M.v.h.  Jørn
Avatar billede slapstick Nybegynder
17. november 2003 - 13:49 #11
ja er desværre nødt til at læse alle linierne ind fordi der skal kunne manipuleres med posterne
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
Kurser inden for grundlæggende programmering

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