Avatar billede iceyblue Nybegynder
16. marts 2004 - 17:46 Der er 56 kommentarer og
1 løsning

Komprimering af Access database fil

Hejsa...

Jeg arbejder med en Access database fil fra en c# win form...men har fundet ud af...at den fylder utroligt meget...lige nu er der kun én række i den og den fylder 950kb...hvis jeg benytter winrar på den fylder den kun 14kb....

Er der nogen mulighed for at komprimerer den og samtidigt have mulighed for at tilgå den?

/IceyBlue
Avatar billede bufferzone Praktikant
16. marts 2004 - 17:54 #1
I Access kan du komprimmere dine databaser. I funktioner - databasefunktioner - komprimer og reparer databasen.

Denne funktion defragmentere databasen og får den til at kører hurtigere end før. Dette bør gøres jævnligt
Avatar billede iceyblue Nybegynder
16. marts 2004 - 18:47 #2
NU er det sådan...at det skal ske fra mit program af...dvs. automatisk...det er jo ikke noget brugeren af programmet skal rode med...Kan dette lade sig gøre og hvor meget kan det komprimeres?

Findes der en anden smartere måde at gøre det på eller?? Synes blot det fylder utroligt meget set i forhold til hvad det reelt behøver at fylde...??

/IceyBlue
Avatar billede Syska Mester
16. marts 2004 - 19:11 #3
Efter mine erfaringer fylder MS Access filer altid meget, prøv at smid 1000 rækker ind, og jeg skal garantere for at den ikke kommer til at fylde 1000*950 ingen gang det halve så det er ikke et så stort problem......
Avatar billede Syska Mester
16. marts 2004 - 19:15 #4
kommer selvf også an på og du sætter binær data ing i den.... :-)
Avatar billede burningice Nybegynder
16. marts 2004 - 20:23 #5
Problemet er, at når du sletter nogle poster fra access bliver bliver mdb-filen ikke mindre. Den plads der til at starte med blev allokeret til en given post bliver ikke frigjort igen når den slettes... det sker først når du, som bufferzone siger, kører en komprimer på den.

Så...

1) Lad vær med at slette poster i flæng...
2) Skift fra Access til noget mere brugbart... MSDE f.eks.
Avatar billede burningice Nybegynder
16. marts 2004 - 20:25 #6
ang. dit spm: "Er der nogen mulighed for at komprimerer den og samtidigt have mulighed for at tilgå den?"

jo,... med lidt fiksfakseri burde det kunne lade sig gøre... der findes et Zip-library til C#, så du burde kunne have din mdb-fil i en zip-fil og så loade databasen op i hukommelsen og tilgå den derfra... når du så er færdig pakker du den ned i zip-filen igen. Det kræver en del kodning, og du bliver nok også nødt til at lave din egen access-driver, så det er måske ikke helt så rentabelt.
Avatar billede iceyblue Nybegynder
16. marts 2004 - 21:15 #7
hhmm...det var sgu da ikke særligt smart lavet...!!??? der MÅ da være en smartere måde at gøre det på?

Jamen, hvis vi nu siger at vi har lagt 10 stk rækker i databasen og sletter 9 af dem...så fylder den stadig præcis det samme...? Men når jeg tilføjer nogle nye igen, så benytter den vel for faen tidligere benyttede og nu ledige pladser igen??

Hvilke alternativer findes der?? Hvad er MSDE og er det smart(ere)??

det eneste krav er....at det skal fungere lokal på en pc...det benyttes sammen med et "standalone" prog...så ikke noget med at forbinde til nogen server, kodeord eller noget :)

Håber virkelig i kan hjæpe på...det haster nemlig meget med at få det implementeret...så det ville være et sort plus hvis løsningen ikke var FOR tidskrævende...

/IceyBlue
Avatar billede burningice Nybegynder
16. marts 2004 - 21:25 #8
ja... hvis du har 10 og sletter 9 bliver din mdb-fil ikke mindre af den grund... og nej, den spildte plads udnyttes ikke når du opretter de samme 9 records igen. Om det er smart lavet eller ikke skal jeg ikke kunne udtale mig om. Det må jo have sine grunde siden det er lavet på den måde.

Ang. alternativer findes der skam mange. Nu kender jeg ikke dit behov, men hvis det skal være filbaseret kunne xml-filer måske bruges? Ellers er der som sagt MSDE, som er storebror til Access og lillebror til MSSQL. Den er nem at lave "silent install" på og kører bare i baggrunden uden at brugere opdager noget. Perfomancemæssigt klarer den sig udemærket.
Avatar billede arne_v Ekspert
16. marts 2004 - 21:39 #9
MSDE er en udmærket database. Men jeg er ikke overbevist om at det er den
rigtige løsning hvis man er bekymret over størrelsen på en Access database
på 1 MB !
Avatar billede arne_v Ekspert
16. marts 2004 - 21:43 #10
Medmindre du kan nøjes med XML filerne så er den mest praktiske løsning
nok at bruge Access, leve med de 1 MB og evt. lade din applikation lave en compress
på passende tidspunkter.
Avatar billede iceyblue Nybegynder
16. marts 2004 - 22:01 #11
HEY...jeg er ikke bekymret over 1mb...hehehe...slet ikke...tænkte blot at det fylde meget i forhold til at det pakket fylder 67 gange mindre! Dette valgt handler ikke kun om hvad der KAN lade sig gøre i praksis men også hvad der er et fornuftigt valg...det er nemmerelig til et projekt...jeg skal til eksamen i! Så det må jo meget gerne være velovervejet og smart...

OG der bliver tilføjer mellem 5 til 30 stk rækker hver eneste ene dag...
og lidt hovedregning siger 30stk x 365dage x 10år = 109.500 rækker! 20år....

det kan godt være dette slet ikke er noget problem...jeg er IKKE ekspert på dette område...men mine tanker strejfer blot emne, da programmer jo gerne skulle virke om nogle år...;)

Men Access vil stadig være fint egnet hertil?

ARNE V >> Hvordan laver jeg et "compress" ind fra min C# kode af...kan du give et eksempel...??
Avatar billede arne_v Ekspert
16. marts 2004 - 22:05 #12
110000 rækker er stadigvæk ikke så meget. Sandsyneligvis fylder de mindre
end en tom MSDE master database.
Avatar billede arne_v Ekspert
16. marts 2004 - 22:07 #13
Du kan nemt kompresse en MDB fil ved at køre MSACCESS.EXE med /COMPACT switchen.
Avatar billede arne_v Ekspert
16. marts 2004 - 22:08 #14
Men prøv da og sæt 100000 rækker ind og se hvor meget det fylder.
Avatar billede iceyblue Nybegynder
16. marts 2004 - 22:08 #15
Jeg har forresten rodet med XML filer og dataset tidligere...Men det gik jeg væk fra...pga. så vidt jeg kunne finde frem til...så kan man IKKE oprette en direkte forbindelse til sin xml-fil(dataset) på disken...dvs. der er IKKE mulighed for at udføre SQL på det direkte på disken ligesom  der er når man benytter Access...og det virker jo rimeligt kikset at hente hele sin database(indhold af XML-filen) ind i sit program...for først bagefter at arbejde videre på den...eller er det mig som har misforstået noget her??
Avatar billede arne_v Ekspert
16. marts 2004 - 22:10 #16
Hvis data mængderne er for store til at det virker fikst at hente al data ind
i memeory, så er XML ikke en god løsning.
Avatar billede iceyblue Nybegynder
16. marts 2004 - 22:15 #17
Jamen...så har jeg jo forstået det rigtigt...pyyha...det var da altig noget :)
Min sti til databasen er : kunInstallationsSti+"\\Database\\DataBasePatientResultater.mdb hvordan vil et "compress" så se ud på denne fil?
Avatar billede arne_v Ekspert
16. marts 2004 - 22:23 #18
\wherever\MSACCES.EXE \whereever\database.MDB /COMPACT

(evt. med /WRKGRP, /USER og /PWD hvis nødvendigt)
Avatar billede burningice Nybegynder
16. marts 2004 - 22:30 #19
hehe... hvis du skal køre med samme db i 20 år, så drop access... den har en begrænsning på 64000 records (32-bit), så... forsøget med at indsætte 100000 rækker kan i vist godt droppe.

ang. automatisk compact, det kræver at brugeren har installeret access, hvilket nok ikke altid er tilfældet :/
Avatar billede burningice Nybegynder
16. marts 2004 - 22:32 #20
og ang. xml, så behøver man da ikke læse det hele ind i hukommelsen... man kan da åbne en XmlReader og løbe igennem den som en normal data-reader. Med lidt xslt og lidt andet gejl kan man sagtens få det til at fungere. Prøv f.eks. at se på www.fullxml.com, hvilket er et helt CMS-system med xml-filer som datastore.. funger upåklageligt
Avatar billede iceyblue Nybegynder
16. marts 2004 - 22:37 #21
Cyberfessor...SHIT...tak for det indlæg....kan man ikke udvidde den til 64bit...eller noget i den stil??
Avatar billede arne_v Ekspert
16. marts 2004 - 22:39 #22
Det med Access og 64K passer ikke. Jeg har en Access database med 100000 records
liggende.
Avatar billede iceyblue Nybegynder
16. marts 2004 - 22:39 #23
Det kan da ikke passe at man skal bruge xml, xslt osv...for at benytte en lokal database...jeg tror det vil tage for lang tid at sætte sig ind i...??
Avatar billede iceyblue Nybegynder
16. marts 2004 - 22:41 #24
SÅDAN ARNE! du fører ;) men findes der en umiddelbar begrænsning!?
Avatar billede arne_v Ekspert
16. marts 2004 - 22:48 #25
En Access tabel kan maksimalt være 1 GB.

En record (ekskl. memo og OLE objekt) kan maksimalt være 2000 byte.

Det giver max. 500000 records i tabel af 2000 byte.

Eller en million records af 1000 bytes.
Avatar billede arne_v Ekspert
16. marts 2004 - 22:49 #26
Du bør imidlertid skifte til MSDE betydeligt før det. Som tommelfinger regel vil jeg
sige at omkring 20-50 MB så er Access ikke længere en god løsning på grund
af størrelsen. Der kan være andre grunde til at skifte tidligere.
Avatar billede arne_v Ekspert
16. marts 2004 - 22:54 #27
Hvis man kan leve med sekventiel access, så kan man undlade at læse alt til
memory, men det er ret sjældent at en "database" kun er sekventiel access.
Avatar billede iceyblue Nybegynder
16. marts 2004 - 22:56 #28
okey...? hvorfor kan den lige præcis fylde 2000 bytes? og hvad er memo...min tabel indholder ca. 35 kolonner...hvoraf de 30stk kan nøjer med at være af typen double og de sidste 5stk bliver af typen string...hvordan ser regne stykke se ud...?
Avatar billede arne_v Ekspert
16. marts 2004 - 23:00 #29
memo for tekst > 255 tegn

double fylder 8 byte

tekst har en max. længde på 0-255 tegn

30*8 + 5*255 + lidt ovehead < 2000

30*8 + 5*50 er f.eks. 590
Avatar billede iceyblue Nybegynder
16. marts 2004 - 23:03 #30
Dit indlæg kl. 22.54.49 forstår jeg ikke...? hvad mener du med sekventiel...? altså...jeg har blot brug for at udføre nogle (sql) forespørgsler på dine rækker i databasen...og de matchende rækker vil jeg så gerne hente ind i mit program så at vise i gui mv...
Avatar billede iceyblue Nybegynder
16. marts 2004 - 23:06 #31
Men det lyder jo faktisk til at jeg skal benytte MSDE...hvor langt ligger den teknologi fra det jeg benytter nu...vil det være et større studie at lave for en som mig som aldrig har rodet med det...?
Avatar billede arne_v Ekspert
16. marts 2004 - 23:06 #32
sekventiel = udelukkende fremad

eller på mere jævnt dansk - hver linie i XML filen skal kun bruges en gang
Avatar billede arne_v Ekspert
16. marts 2004 - 23:10 #33
Det betyder ikke meget for din applikation.

Søg og erstat af "OleDb" til "Sql" i din kode og ret din connection string,
så skulle den være på plads.

Men at få installeret den MSDE på fornuftig vis vil nok kræve lidt.

Kittet fylder 60-70 MB mener jeg.

Hvis folk ikke har MSDE burde det være nemt. Problemet er mere dem som allerede
har MSDE.
Avatar billede iceyblue Nybegynder
16. marts 2004 - 23:10 #34
Du skriver at man bør skrifte fra Access til MSDE ved de 20-50mb...hvorfor så lige det...hvordan virker MSDE teknologien...er den meget hurtigere og benytter en god komprimerings algoritme...eller?
Avatar billede iceyblue Nybegynder
16. marts 2004 - 23:17 #35
sorry...men forstof ikke hvad du mener med "Hvis folk ikke har MSDE burde det være nemt. Problemet er mere dem som allerede har MSDE."?
Avatar billede arne_v Ekspert
16. marts 2004 - 23:23 #36
MSDE er bedre end Access når
  1) databasen ligger på en anden server end applikationen
eller
  2) der er mange samtidige brugere som laver opdateringer
eller
  3) databasen bliver stor

De 20-50 MB er bare sådan lidt fornemmelse for #3.
Avatar billede arne_v Ekspert
16. marts 2004 - 23:24 #37
Det er ret nemt at installere software på folks PC hvsi de ikke har det i forvejen.

Det er hundesvært hvis det allerede er der i forvjen, fordi så skal man
tilpasse sig deres setup.
Avatar billede iceyblue Nybegynder
16. marts 2004 - 23:30 #38
okey!...det findes ikke på div. maskiner det skal installeres på i forvejen :)...da maskinen bliver leveret med softwaren...det er faktisk det eneste program som kommer til at ligge på maskinen...maskinerne ligger på min. 600 - 800MHz og ? antal ram....
Vil det egne sig fint til at kører MSDE...kræver Access mindre ressourcer...Hvis man kan sammenligne dette?
Avatar billede iceyblue Nybegynder
16. marts 2004 - 23:32 #39
Forresten....findes MSDE indbygget i Visual Studio eller?
Avatar billede arne_v Ekspert
16. marts 2004 - 23:33 #40
Access vil kræve mindre resourcer (memory) end MSDE.

MSDE kan godt køre på de MHZ.
Avatar billede arne_v Ekspert
16. marts 2004 - 23:33 #41
Ja. Visual Studio installtionen installerer MSDE.
Avatar billede iceyblue Nybegynder
17. marts 2004 - 00:24 #42
I den wizard i VS. jeg benyttede til at oprette min OleDbDataAdapter...hvilke er den samme som når jeg benytter en SqlDataAdapter...før benyttede jeg en Jet 4.0 database provider...hvilken skal jeg benytte nu??

Og...hvordan fungere det der MSDE egentligt...jeg mener...før angav jeg Access filen som kilde...hvad gør jeg nu?? Desuden må databasen heller ikke kræve login/pass...
Avatar billede iceyblue Nybegynder
17. marts 2004 - 02:02 #43
Jeg har fundet ud af at man benytter Access som før...

Men jeg har et andet spg...kan SQL Server 2000 Desktop Engine godt kører på en maskine som kører win98?
Avatar billede iceyblue Nybegynder
17. marts 2004 - 03:23 #44
Hej igen...Ja, jeg bliver ved...håber du kan bære over med mig :)

Jeg sidder og prøver på at oprette min nye MSDE database i Access - men det driller...

Jeg har oprettet et nyt projekt(ADP) - Men hvad er så næste skridt? Kan jeg nu tilføje forskellige typer af database filer...eller? og hvilken er bedst hvis man kan? Jeg har prøvet at oprette en mdb fil og prøve af importere den i mit ADP projekt men den brokker sig over at der ikke er etableret nogen forbindelse imellem projektet og en SQL Server database...?? Da jeg oprettede det nye ADP projekt angav jeg kun et navn og trykkede "cancel" (hvilket siger man skal gøre i følge hjælpe-guiden - men herefter beskriver de ikke flere punkter :( )

Hvad skal jeg nu gøre?

Derudover tænkte jeg på...det kan vel aldrig være dårligt at jeg laver min database om til MSDE fra den normale Access databse som det var før...? eller ? vil nødigt begynde på at lave en overkill database...if u now what i mean!

100.000 rækker vil fylde 50mb...men hvordan vil performance være set i forhold til MSDE...som du kan høre er jeg stadig usikker på mit valg... vil blot være helt sikker på at jeg vælger den bedste løsning ;)

Cyberfesoor skrev tidligere, at Access skal ligge på maskinen for at kunne udfører "Compact" på ens database fil...er det rigtigt? Kan det ikke fikses med et merge modul eller to??

Jeg kan i øvrigt fortælle dig(hvis du ikke allerede ved det?)...at programmet og databasen vil ligge på samme com (i hvert fald sådan som det virker den dag i dag) - derudover er det er ikke et flerebruger system...det benyttes kun til at gemme data og indhente data igen...

Sååå...? hvilken løsning ville du selv foretrække?
Avatar billede arne_v Ekspert
17. marts 2004 - 07:18 #45
Når du opretter dit ADP projekt, så skal du angive connection forbindelse til
MSDE.

Umiddelbart vil jeg sige at 10 år er irrelevant med den her teknologi. Der vil
ske teknologiske opdateringer inden de 10 år er gået.

Med 50 MB indenfor en realistisk tidshorisont ville jeg nok vælge MSDE.

Brug af MSACCESS.EXE kræver Access installeret. Men det har rigtigt mange PC'ere.
Microsoft har også et kit hvor man kan distribuere en runtime version af
Access (uden betaling per client - kun betaling for kit). Jeg tror også at
man kan lave det med DAO, men det vil ikke være C# venligt.
Avatar billede arne_v Ekspert
17. marts 2004 - 07:19 #46
Og et svar
Avatar billede burningice Nybegynder
17. marts 2004 - 07:53 #47
ok, jeg giver mig... ang. det antal af records. Havde bare læst det engang og har tit hørt det som en ulempe ved at bruge access.

Ang. max size af en tabel er det vist 2 gb for version 2000+ (http://dbforums.com/arch/106/2003/8/410715)

iceyblue>> har du nogensinde fortalt hvilket slags program det er og hvor mange poster der bliver oprettet på... f.eks. en dag?
Avatar billede iceyblue Nybegynder
17. marts 2004 - 10:40 #48
ARNE V >> du får dine fortjente points...men fortæl mig lige hvad det kit hedder og hvor jeg kan hente det?
Avatar billede burningice Nybegynder
17. marts 2004 - 10:43 #49
Avatar billede iceyblue Nybegynder
17. marts 2004 - 11:40 #50
Arne v >> du skrev tidligere "prøv da at insætte 100.000 rækker"...MEN hvordan går jeg lige det smartest??

En anden ting...selvom de slettede rækker ikke reelt bliver fjernet fra databasen... går det så heller ikke hurtigere at søge i, end hvis der lå data i de givne rækker...

Er det muligt at lave nogen beregning på hvor langt tid det vil tage at udføre en given sql forespørgsel på en access database?
Avatar billede Syska Mester
17. marts 2004 - 12:26 #51
angående "Arne v >> du skrev tidligere "prøv da at insætte 100.000 rækker"...MEN hvordan går jeg lige det smartest??"
Lav en loop der gentager sig selv 100.000 gange, og smid noget data ind hver gang, det ville nok være det nemmeste....

angående tiden, tag en start tid, og en slut tid, og træk de 2 fra hinanden, så har du et resultat som er tiden, meget nemt....
Avatar billede iceyblue Nybegynder
17. marts 2004 - 13:15 #52
tager det da lige lang tid at indsætte 100.000 rækker som det vil tage at søge i 100.000 rækker? det kommer vel an på hvad man søger på? fordi vil nogle søgningen ville det jo egetligt kunne benytte en binær søgealgoritme eller lign...

Men den benytter måske den sammen algoritme hver eneste gang?
Avatar billede Syska Mester
17. marts 2004 - 13:55 #53
tager ikke lige så lang tid at søge, bare rolig :-), kommer jo også an på hvor mange felter du søger i.
Avatar billede arne_v Ekspert
17. marts 2004 - 15:13 #54
Access runtime kit plejer ikke at være gratis men et produkt.

Det vil normalt være betydeligt hurtiger et asøge i N rækker end at indsætte N
rækker.

Hvis der er er index på det felt man søger efter en bestemt værdi af, så
laver databasen (både Access og MSDE) noget smart.
Avatar billede iceyblue Nybegynder
18. marts 2004 - 01:35 #55
Jeg til at tænkte på...eksistere den mulighed også at gemme data bibært i databasen? jeg tænkter på den række som et objekt...? kan det lade sig gøre og vil det være en fordel/fylde mindre?
Avatar billede burningice Nybegynder
18. marts 2004 - 10:11 #56
det kan du sagtens... datatypen skal bare være blob, og du gemmer et byte-array (byte[]).
Avatar billede arne_v Ekspert
18. marts 2004 - 16:18 #57
Man vil stort set ikke spare plads ved at gemme en hel record.

Og det vil ødelægge fordelene ved SQL (queries) totalt.

Og det hedder BLOB i MSDE - i Access gemmer man BLOB's i OLE objekt.
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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