Avatar billede danm Nybegynder
13. april 2006 - 02:52 Der er 13 kommentarer og
2 løsninger

Bedste måde at gemme alle postnummre

Hej

Jeg skal have tilføjet en funktion til mit program som automatisk skriver bynavnet ind når man indtaster postnummeret i et felt.
Mit spørgsmål er så bare, hvordan dataen gemmes bedst uden at være langsomt om at hente det. Er det bedst at undgå database? Kan jeg bruge arrays eller lave en slags vituel datagrid jeg kan søge i. Nogen der har en ide til hvilket der henholdsvis fylder mindst og hurtigst finder dataen. Vil det eksempelvis fylde for meget at have i hukommelsen, hvilket jo nok ville være hurtigst.
Avatar billede arne_v Ekspert
13. april 2006 - 04:41 #1
5000 postnumre x 20 byte = 100 KB

lyder ikke som et problem at gemme i memory

så læs det op fra memory en gang og gem det til hver gang du skal bruge det
Avatar billede Slettet bruger
13. april 2006 - 06:16 #2
Er du på .NET2 så bruger du en Dictionary<int, string> hvor int er postnummer og string er bynavn.

på .NET1.1 skal du have fat i en Hashtable men pointen er den samme.

Nu er det en win-app vi snakker og ikke en web applikation ikke ?
Avatar billede arne_v Ekspert
13. april 2006 - 13:15 #3
det betyder ikke så meget

i begge tilfælde kunne man gemme den data struktur i en singleton

i win app kunne man bruge en shared variabel et sted

i web app kunne man gemme data strukturen i application objektet
Avatar billede danm Nybegynder
13. april 2006 - 14:15 #4
Hm.. Jeg har nogle tykke bøger jeg har købt (den største på 1300 sider) om vb2005 men jeg kunne ikke finde ret meget om dictionary og hvordan jeg laver dem, de var kun nævnt ganske kort under noget med hashtable. Vil i hjælpe med et lille eksempel?

PS. Hvad er en singleton?  (o=
Avatar billede arne_v Ekspert
13. april 2006 - 14:17 #5
Avatar billede arne_v Ekspert
13. april 2006 - 14:18 #6
Avatar billede arne_v Ekspert
13. april 2006 - 14:19 #7
en singleton er en klasse som der kun kan eksistere en instans af
Avatar billede Slettet bruger
14. april 2006 - 06:15 #8
Man kan godt bruge en singleton i en web app. Så skal man bare sørge for at den er tråd-sikker (double lock pattern) så behøver man ikke bruge applikationsobject, hvilket jeg altid har fundet en dårlig ting, men det er en smags sag helt og holdent. En løsning uden applikationsobjekt og med singleton i stedet ville gøre at det kunne bruges ligeværdigt i en web og en win-app.

Det hvor det i virkeligheden får betydning er hvis vores ven her skal have det til at fungerer i en web-form uden af vende serveren først. Egentligt derfor det var interessant om det er en win-app. eller en web-app.
Avatar billede danm Nybegynder
14. april 2006 - 14:34 #9
Fint og takker, det virker.. Jeg har lavet det som:

dim postnummer as new dictionary(short,string)

og tilføjer med

postnummer.add(9000, "Aalborg")

og kalder med

x=postnummer(9000)

Er det den hurtigste måde, eller er sådan noget som hashtable hurtigere?

Men smid svar begge to, så deler i point..
Avatar billede arne_v Ekspert
15. april 2006 - 02:58 #10
svar
Avatar billede arne_v Ekspert
15. april 2006 - 03:01 #11
med hensyn til double locking så er det sidste jeg har læst at det heller ikke
virker i .NET generelt (mere specifikt virker det på x86 og x86-64 men ikke
på Itanium)
Avatar billede Slettet bruger
15. april 2006 - 06:30 #12
Double locking fungerer på .NET den variable som bruges skal blot være defineret volatile, da man derved sikre at write er lavet færdigt inden andre kan se variablen.

lille eksempel.
private object syncRoot = new object();
private bool _CacheFilled = false;

if(!_CacheFilled) {
  lock(syncRoot) {
    if(!_CacheFilled) {
      FillCacheOrWhatEver();
      _CacheFilled = true;
    }
  }
}

ovenstående kan fejle da checket for _CacheFilled kan optimeres ud men hvis _CacheFilled defineres som følger fungerer det som det skal.

private volatile bool _CacheFilled = false;

Uden volatile kan man stort set lige så godt lade være i ved et release build.-
Avatar billede Slettet bruger
15. april 2006 - 06:33 #13
Danm: Dictionary i .NET2 er en Hashtable med generics og ja det er den hurtigste måde med mindre du vil bruge lidt ekstra RAM og have postnumrene liggende i et Array hvor index er postnummer - men du skal så have en markering af de postnumre som ikke er "lovlige", men til dit brug tror jeg ikke sådan en afviklingsoptimering gør nogen gavn så hold du bare Dictionary, det må vist anses for den fornuftige løsning her.
Avatar billede danm Nybegynder
15. april 2006 - 21:55 #14
oki.. kryptos smid svar.. så er der lidt til deling..
Avatar billede Slettet bruger
16. april 2006 - 06:12 #15
x
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