16. marts 2004 - 17:46Der 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?
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...??
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......
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.
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.
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...
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.
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 !
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.
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...??
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??
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?
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 :/
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
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.
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...?
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...
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...?
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?
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.
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?
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...
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?
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.
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?
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....
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?
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?
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.
Synes godt om
Ny brugerNybegynder
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.