Toon posts:

[VB6] Listbox kan maar 32144 regels aan, hoe verander ik dit

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik heb een programmatje geschreven die waarden in een listbox zet.
En deze later dan wegschrijft naar een MDB'tje.
Als ik het programma'tje rerunt heb staan er maar 32144 records in
mijn mdb'tje hoewel er eigelijk 2,5 miljoen records in zouden moeten staan.
De mdb is 6,4 mb groot dus hier ligt het niet aan.

Ik heb dit verder uitgezocht en nu blijkt dat mijn listbox niet meer
als 32144 waarden aan kan.
Hoe krijg ik een listbox die wel 2,5 miljoen+ waarden aan kan.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Door geen listbox te gebruiken als dataopslag, maar alleen voor de weergave. Je kunt dan de data in 'pages' opdelen en die een voor een laten zien.

Een listbox is een UI element, geen datacontainer.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Als je een listbox van 2,5M records wilt gebruiken, doe je toch iets verkeerd. Hoe lang denk je dat het duurt voordat je daarin een item geselecteerd hebt?

Als het om text gaat, doe je er denk ik beter aan eerst de gebruiker te laten preselecteren op de eerste letter, en dan alleen de listbox met die elementen vullen.

En dan heb je nog steeds 100k elementen per letter, dus dat wil je nog eens splitsen in 5 pagina's ofzo.

edit:
Oeps, niet goed gelezen. Nou ja, als het nog niet eens voor gebruiker-interactie is dan is het helemáál om te gillen. Niet doen dus!

[ Voor 19% gewijzigd door Verwijderd op 27-07-2004 15:27 ]


  • RobzQ
  • Registratie: Februari 2000
  • Laatst online: 21-12-2020

RobzQ

greedy as a pig

2,5 miljoen records in een listbox.. Ik hoop niet dat je gebruikers ooit op het listboxje hoeven te klikken, anders kunnen ze beter even koffie gaan drinken.

MAW : Je misbruikt de listbox volgens mij. Kun je niet gewoon direct met de recordset in het geheugen werken?

..so be wary of any man who keeps a pig farm..


  • veer0318
  • Registratie: September 2003
  • Laatst online: 01-04 09:38
Waarom zou je in de eerste plaats al 2.5 miljoen records laden in 't geheugen? Voor zoekacties gebruik je toch gewoon de database zelf? :z

Verwijderd

Topicstarter
Ik gebruik de listbox meer voor dataopslag.
Niemand hoeft erin te zoeken. Ze zien zelf de listbox niet.
Ik gebruikte de listbox op het begin als controle methode.
Maar ik heb nog nooit meer als 32144 waardes omgerekend.
Ik gebruikt 2 listboxen met coordinaten die dan later
weggeschreven worden als coordinaten in andere stelsellen.

Als alle listboxen van de verschillende stelsellen gevult zijn
worden ze allemaal weggeschreven naar de mdb.

  • igmar
  • Registratie: April 2000
  • Laatst online: 12-05 15:46

igmar

ISO20022

Verwijderd schreef op 27 juli 2004 @ 15:43:
Ik gebruik de listbox meer voor dataopslag.
Een listbox is een UI element, geen dataopslag.
Als alle listboxen van de verschillende stelsellen gevult zijn
worden ze allemaal weggeschreven naar de mdb.
Een andere datacontainer nemen. Een gewone array, een sql dataset, etc, etc.

Verwijderd

Topicstarter
Toch vindt ik bepaerkt van vb dat je een listbox niet als visuele array kunt gebruiken. En dit kunt defineren als LONG DOUBLE ofzo.

Nu moet ik men hele programma omschrijven wat weer een paar uur duurt.

Mijn geddachte om het op deze manier te doen is eigelijk voor de performance

uitleg:

2,5 miljoen records uit een MDB is veel.
Daarop moet hij +- 4 berekeningen op uitvoeren.
En dit geheel wegschrijven naar database.

Als ik dit per record doe maakt hij per record 2 keer kontakt met de database
op de hardeschijf.
Dat is al 5 miljoen keer de toegangstijd van je hardeschijf.
Deze ligt vele malen hoger als je toegangstijd van je geheugen.
Dus alles in een keer lezen van mdb en schrijven naar mdb is
waarschijnlijk velen malen sneller.

Nu ga ik het anders programeren en doe het wel op de langzame manier en
handel het record per record af.

  • glashio
  • Registratie: Oktober 2001
  • Laatst online: 23-05 18:57

glashio

C64 > AMIGA > PC

Ik moet je gelijk geven ( kwa Specs. Listbox ) MS geeft niet op wat het maximum is :)
Zie hier.

> Google Certified Searcher
> Make users so committed to Google that it would be painful to leave
> C64 Gospel
> [SjoQ] = SjoQing


Verwijderd

Verwijderd schreef op 27 juli 2004 @ 16:09:Nu ga ik het anders programeren en doe het wel op de langzame manier en
handel het record per record af.
Ik denk dat de gegevens rechtstreeks in je geheugen hebben in een array of dictionary (of array van dictionaries, of wat dan ook), stukken sneller is dan het in een listbox hebben.

Het zijn trouwens geen twee extremen hè. Het is niet OF 'in mijn geheugen in een listbox' OF 'record per record direct van schijf'. Er zit ook iets tussenin.

Overigens is het misschien een optie de gegevens, als er structuur in zit, eerst in één keer in de database in te lezen en daarna de transformaties die nodig zijn via queries uit te voeren.

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Kan je je berekening record voor record doen? (geldt: nieuwe_waarde = f(oude_waarde) met f een normale wiskundige functie?). Dan kan je dit gewoon doen door een update op je database te doen...
... en zoniet, kijk naar arrays als je record gestuurde data in geheugen wil bewerken...

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • igmar
  • Registratie: April 2000
  • Laatst online: 12-05 15:46

igmar

ISO20022

Verwijderd schreef op 27 juli 2004 @ 16:09:
Toch vindt ik bepaerkt van vb dat je een listbox niet als visuele array kunt gebruiken. En dit kunt defineren als LONG DOUBLE ofzo.
Waarom geen gewone array ?
2,5 miljoen records uit een MDB is veel.
Daarop moet hij +- 4 berekeningen op uitvoeren.
En dit geheel wegschrijven naar database.

Als ik dit per record doe maakt hij per record 2 keer kontakt met de database
op de hardeschijf.
Dat is al 5 miljoen keer de toegangstijd van je hardeschijf.
Deze ligt vele malen hoger als je toegangstijd van je geheugen.
Dus alles in een keer lezen van mdb en schrijven naar mdb is
waarschijnlijk velen malen sneller.

Nu ga ik het anders programeren en doe het wel op de langzame manier en
handel het record per record af.
Wat is het probleem om gewoon al de data in een gewone array in te lezen ? Ik snap even niet goed waarom je daar een listbox voor ge(mis)bruikt

Verwijderd

glashio schreef op 27 juli 2004 @ 16:17:
Ik moet je gelijk geven ( kwa Specs. Listbox ) MS geeft niet op wat het maximum is :)
Zie hier.
Er zit weldegelijk een maximum aan.
215 = 32768 = integer

  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Als je ook nog door de data wilt kunnen zoeken op een makkelijke manier dan zou je een fabricated recordset kunnen overwegen. Dit is een ADODB.Recordset die je helemaal zelf bouwt qua velden e.d. en die dus ook geen Activeconnection heeft.

Of het wenselijk is om 2.5 miljoen records in het geheugen te bewaren is weer iets anders :)

Verwijderd

Een database van 6 MB?
Wellicht kun je de data in een tijdelijke "flat file" opslaan. Dit bestand koppelen aan een memory mapped file.

hmm, VB6....

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 22-05 23:32

alienfruit

the alien you never expected

Je kan natuurlijk ook een virtual listbox gebruiken ;)

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Verwijderd schreef op 27 juli 2004 @ 15:43:
Ik gebruikt 2 listboxen met coordinaten die dan later
weggeschreven worden als coordinaten in andere stelsellen.
Misschien dat je het in een sql query kunt formuleren, iets van
code:
1
UPDATE coord SET new_coord = func( old_coord ) WHERE ...... ;

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Ik zeg twee woorden Disconnected Recordset. Dan haal je in een keer je data op. En vervolgens bewerk je de dataset (met een query bijvoorbeeld) en sla je de boel weer op.

Anders moet je een denken aan een datagrid. Ik weet niet of die 2,5 milj. records kan tonen maar dat moet je zelf maar uitproberen.

Is het ook niet een beetje een kwestie van design om dit van te voren te bedenken zodat je niet achteraf uren kwijt ben aan het repareren van de problemen? :7

Verwijderd

Topicstarter
Ik zal een paar antwoorden proberen te beantwoorden :

- Ik gebruikte listbox om manuele check doot te voeren van alle berekeningen.
Sommege berekeningen hebben de uitkomst van andere berekeningen nodig.
Dus dan moet je doorrekenen en ik wou er zeker van zijn dat dit goed ging.
Alles werkte en heb alles zo laten staan totdat ik bij 2,5 miljoen records kwam.

-En over berekeningen gesproken het is niet een berekening dit je normaal op je
rekenmachine en ook niet op een advanced rekenmachine kunt doen. Hiervoor
heb ik een hele module. Daarom gaat dit ook niet met een SQL statement.

- Sommige mensen krijgen een MDB met MGRS coordinaten deze moeten dan
omgezet worden naar DEC LatLon, UTM, DMS Latlon. Deze moeten in een
andere MDB komen omdat de vorige niet aangepast kan/mag worden.

Eigelijk was mijn vraag ook hoe ik een listbox kan defineren naar een DOUBLE ofzo.
Ik weet hoe ik dit anders programmeren kan het duurt alleen een stuk langer.

Maar toch bedankt voor alle reacties.

Verwijderd

Verwijderd schreef op 28 juli 2004 @ 10:26:

Eigelijk was mijn vraag ook hoe ik een listbox kan defineren naar een DOUBLE ofzo.
Ik weet hoe ik dit anders programmeren kan het duurt alleen een stuk langer.
Dan zul je het in een collection moeten zetten.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Normaal gesproken gebruik je logging of je normale debug mogelijkheden om de werking van je code te controleren. Anywayz, met een listbox kan het natuurlijk ook wel maar als je je code dan zo schrijft dat het niet zonder je debug elementen kan ( je listbox ), doe je toch iets gruwelijk verkeerd naar mijn idee.

Er zijn nu echter meerdere oplossingen genoemd, die jou geen van allen bevallen omdat je code niet zonder die listbox kan. En die listbox kan niet wat jij wilt.

Lijkt me een impasse ....

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Unifex
  • Registratie: Juni 2002
  • Laatst online: 02-04 13:57
LOL,

Ik heb net effe voor de gein toch maar een test gedaan, maar met SP-5 _/-\o_ lijkt de listbox toch echt 2.500.000 entries aan te kunnen. Misschien dat er toch iets anders aan de hand is :)

code gebruikt:

Dim x As Long
List1.Visible = False
For x = 0 To 2500000
Call List1.AddItem(CStr("_: " & x))
Text1.Text = CStr(x)
DoEvents
Next
List1.Visible = True

maar goed het gebruik van een listbox hiervoor is natuurlijk gewoon niet ok. |:(

Guess what we are not stupid, just ignorant!


  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Wat je kunt doen is of datasets hiervoor te gebruiken of array of collection. Het is maar net wat het fijnst en snelst is, maar listbox is toch zeker veel te traag en niet goed voor je programma/geheugen. Als je gebruik maakt van datasets/arrays/collections dan hoef je niet de hele tijd de database te benaderen, het is maar net hoe je het progd. Ik weet zeker dat deze methodes wel minimaal 2x zo snel gaan en efficienter.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Unifex schreef op 28 juli 2004 @ 12:13:
LOL,

Ik heb net effe voor de gein toch maar een test gedaan, maar met SP-5 _/-\o_ lijkt de listbox toch echt 2.500.000 entries aan te kunnen. Misschien dat er toch iets anders aan de hand is :)
Das allemaal wel aardig, maar je kunt niet meer bij je listdata zonder ze te selecteren ( parameter voor list property is een integer ), en de listcount is bij mij niet de waarde die het zou moeten zijn.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Unifex
  • Registratie: Juni 2002
  • Laatst online: 02-04 13:57
Dat is waar, maar goed daar ging het me niet om 8)7.
Je kunt 32767 items opvragen en meer kwijt, ipv 32144.
Vandaar dat ik me afvroeg of er niet iets anders fout ging.

That's all O-).

Guess what we are not stupid, just ignorant!


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Verwijderd schreef op 27 juli 2004 @ 16:09:
Mijn geddachte om het op deze manier te doen is eigelijk voor de performance
Mijn gedachte is dat het hilarisch is om er blind vanuit te gaan dat er niet over performance is nagedacht door DB/OS-ontwerpers.

Waar denk je dat databases voor gemaakt zijn :? Voor databases met twintig records :?

En denk je dat men in het OS niet heeft nagedacht over herhaalde schijftoegang :? *kuch*cache*kuch*

Hoevaak moet die bewerking eigenlijk uitgevoerd worden? Is het een eenmalig iets? Dan zou ik niet eens zoveel over performance nadenken, maar meer over ontwikkeltijd.

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.

Pagina: 1