Avatar billede stigc Nybegynder
07. november 2004 - 14:15 Der er 18 kommentarer og
2 løsninger

Indsætte data midt i en fil.

Kan det passe at jeg ikke kan indsætte data midt i en fil uden at skulle skrive filen helt om? Jeg vil f.eks indsætte en byte midt i en 100 mb stor fil. Hvordan?
Avatar billede stigc Nybegynder
07. november 2004 - 14:17 #1
Hvordan klarer en database så clustered indexs?
Avatar billede arne_v Ekspert
07. november 2004 - 14:26 #2
Ja. Sådan er det.
Avatar billede arne_v Ekspert
07. november 2004 - 14:29 #3
En database har nogle muligheder fordi den kan skelne mellem en logisk
struktur og en fysisk struktur.

En sekventiel disk fil har samme kun et niveau. Ihvertfald de mest gængse fil
systemer.

Rent teknisk behøver du ikke skrive hele filen om men kun at genskrive alt fra
hvor du sætter ind. Men det er ikke helt simpelt at lave.
Avatar billede stigc Nybegynder
07. november 2004 - 14:45 #4
Hvis rettelsen ligger i første del af filen, skal man jo skrive det hele om. En løsning er vel at arbejder med mange små filer. Dette giver mig dog en langsommer læsning af hele indholdet.
Avatar billede arne_v Ekspert
07. november 2004 - 14:48 #5
Det mest oplagte var nok at skifte til en database.

Mange små filer og et system til at holde styr på hvor hvad er begybder jo at
ligne en mini database.

Du kan jo eventuelt kigg epå en embedded database altså en database
hvor database koden er i samme process som dit program så brugeren
ikke skal starte en database.
Avatar billede myplacedk Nybegynder
07. november 2004 - 16:18 #6
> Hvis rettelsen ligger i første del af filen, skal man jo skrive det hele om.

Alternativt kan du tilføje det i slutningen af filen, og så have et index der fortæller hvilken rækkefølge stumperne kommer i.
Og hvis du så sletter noget midt i filen, kan du blot lade pladsen stå. Når du så senere indsætter noget, kan du evt. placere det der.

Sådan fungerer filsystemet på din harddisk. Harddisken kan betragtes som én stor fil, eller en partition på en harddisk kan betragtes som én stor fil. Og problemet med filer der vokser, er præcist det samme, når en anden fil kommer lige bagefter.
Avatar billede stigc Nybegynder
07. november 2004 - 17:03 #7
Problemet er at det jeg skal gemme er meget lidt. Nøglen er lang, med værdien er kort. Så data i sig selv kan lige så godt være sorteret.
Avatar billede arne_v Ekspert
07. november 2004 - 17:13 #8
Mit råd er enten en rigtig database eller find et færdigt ISAM/BTree bibliotek.
Avatar billede myplacedk Nybegynder
07. november 2004 - 18:49 #9
> Problemet er at det jeg skal gemme er meget lidt.
Hvis det ikke kan være der, er det ligegyldigt hvor lidt det er. ;-)

Jeg er enig med arne_v: Det lyder som om du har behov for en eller anden form for database-manager, og det er der ikke den store grund til at lave selv.
Avatar billede stigc Nybegynder
07. november 2004 - 19:22 #10
Det var til din bemærkning med et eksternt index.

Jeg ønsker ikke at bruge en db. Men læg et svar, jeg fik jo svar på mit spørgsmål omkring hvad filer kan!
Avatar billede arne_v Ekspert
07. november 2004 - 19:24 #11
svar
Avatar billede stigc Nybegynder
07. november 2004 - 19:37 #12
Jeg kan jo lige så godt bruge Jer, når jeg nu har fat i Jer. :)

Hvis vi forstiller os at vi har en fil bestående af, 32 bytes md5 sum + 2 bytes integer på hver linie. Jeg lader dem ligge sorteret, så jeg hurtigt kan slå op hvilken værdi en md5 sum har. Når jeg nu skal indsætte et nyt, hvordan gør jeg dette, efter det vi har snakket om filer? Hvad gør databaser når de opdateres der indexes? Laver de huller (tomme rækker) i filen?

Allerede ved 30.000 objekter vil filen fylde 1 MB, og så bliver en fuld genskrivning for langsom!
Avatar billede arne_v Ekspert
07. november 2004 - 19:40 #13
Langt de fleste database bruger nok B-træer.

Og det var som sagt også en mulighed for dig.

For selvfølgelig kan du ikke genskrive 1MB hele tiden.
Avatar billede arne_v Ekspert
07. november 2004 - 19:43 #14
Ideen er at man deler data op i pages og organiserer de pages i en træ struktur.

Google fandt den her beskrivelse på nettet:
  http://cis.stvincent.edu/swd/btree/btree.html
Avatar billede arne_v Ekspert
07. november 2004 - 19:44 #15
Den medfølgende koder er i C++ men beskrivelsen er sprog uafhængig.

Jeg vil som sagt tidligere anbefale dig at finde et færdigt bibliotek fremfor
selv at implementere fra scratch.
Avatar billede _carsten Nybegynder
07. november 2004 - 20:25 #16
Hvis du IKKE vil bruge en db, kan du jo kigge på RandomAccessFile, her skulle du langt kan ad vejen kunne opnå det du ønsker.
Den bygges op i en record lignende struktur og du kan redigere et hvilket som helst sted i filen, du skal bare selv holde styr på hvad og hvor.

http://java.sun.com/docs/books/tutorial/essential/io/rafs.html
Avatar billede arne_v Ekspert
07. november 2004 - 20:27 #17
Den løser ikke problemet.

Det er kun Random Access.

At man kan læse og skrive på byte adresse skaber ikke plads til noget mellem
2 records.
Avatar billede arne_v Ekspert
07. november 2004 - 20:31 #18
Et B-tree system vil dog uden tvivl bruge RandomAccessFile.
Avatar billede _carsten Nybegynder
07. november 2004 - 20:33 #19
Nej - det er fuldstændig korrekt, der kan ikke indsættes mellem 2 records.

Kan se jeg har været lidt for hurtig til at læse spørgsmålet :)
Avatar billede arne_v Ekspert
21. november 2004 - 20:23 #20
stig>

OK ?
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