Avatar billede rasmuslh Nybegynder
14. maj 2005 - 12:27 Der er 13 kommentarer og
1 løsning

Binær streng til extended ASCII

Hejsa

Vi er to studenrende der arbejder på et projekt der skal optimereren database ved at gemme en bitsekvens på den bedst mulige måde.

Vi har en binærstreng (repræsentret som en String i Java) som vi gerne vil have gemt som en string i en database da man så kan bruge varchar som datatype og så hive den ude igen og i java lave den om til en binærstreng igen.

Kan nogen hjælpe med det. Har søgt i en tidligere poster, men synes ikke der er nogen der beskriver det samme problem.

I teorien er det lige meget hvordan vores bitsekvens repræsenteres så længe det er en string i databasen der på en komprimeret måde repræsenterer vores unikke bitsekvens og hver character unikt kan oversættes til en binær streng. 

Vores bitsekvens er altid delelig med 8 altså den fylder et helt antal bytes.


På forhånd tak.

Rasmus
Avatar billede arne_v Ekspert
14. maj 2005 - 12:31 #1
jeg ville helt klar foreslå at i opbevarer dat i et byte array og gemmer/henter
til/fra databasen via en PreparedStatement og at feltet i databasen er BLOB
(eller hvad det nu hedder i den pågældende database).
Avatar billede rasmuslh Nybegynder
14. maj 2005 - 12:46 #2
Vi arbejder med en Oracle database version 10.*.

Dataen kommer fra en XML-dokument som køres igennem en SAX-parser. Derfra får hver knude et nummer. Det nummer omsætter vi til en bitsekvens for at det skal fylde mindst muligt. Ved at sammensætte bitsekvensen fra alle tidligere knuder kan man for hver knude i hierakiet lave en unik sti op til root-elementet. Den sti vil vi gerne gemme som en bitsekvens. Problemet er at stien kan fylde alt mellem 4 byte og 12 byte. Derfor vil vi gerne bruge en datatype der selv tilpasser sig indholdet.
Først omsatte vi sekvensen til en Integer, men efterhånden blev tallet for stort så nøjagtigheden røg. Derfor har vi vendt os mod String så en sti på fx 128 bits kan repræsenteres som en String på 16 tegn ex. "GD&GSDJSGDJdfhjk". Den string vil vi så hive ud af databasen transformere tilbage til en bitsekvens og arbejde på den.

Giver det mening?

Mvh.
Rasmus
Avatar billede jakoba Nybegynder
14. maj 2005 - 18:47 #3
Hvis det i gemmer i databasen virkelig er et træ, så er besbparelsen ved variabel længde minimal. I en binært træ vil fx halvdelen af jeres node have fuld længde (bladene) halbdelen af resten vil have 'fuld lengde -1', osv. Ikke meget at spare.
Og et træ bygget udaf et xml dokument wil sandsynligvis være meget bredere.

Prøv lige at regne på det om besparelsen er umagen værd.

mvh JakobA
Avatar billede rasmuslh Nybegynder
15. maj 2005 - 12:41 #4
Det er jeg ikke helt med på. Vi gemmer ikke XML-dokumentet som et træ med laver en tabel for hver niveau i XML-dokumentet. Jeg er helt sikker på at det godt kan betale sig at vælge en datatype med variable længde.
Avatar billede rasmuslh Nybegynder
16. maj 2005 - 12:34 #5
Fro lige at opsmummere porblematiken. Jeg har en bitsekvens - den vil jeg gerne lave til en form for Characters. Gemme i min database som en string og derefter hive ud af databasen og lave den til en bitstreng.

Grunden til at jeg ikke bare laver bitstrengen til en Integer er at tallet bliver for højt så det bliver afrundet.
Avatar billede arne_v Ekspert
16. maj 2005 - 12:39 #6
Jeg mener stadigvæk at et byte array i programmet og en BLOB i databasen er
vejen frem.
Avatar billede rasmuslh Nybegynder
16. maj 2005 - 12:45 #7
Problemet er at vi gerne vil have en datatype der tilpasser sig indholdet. Vores bitstreng kan være alt mellem 4 bytes og 15 bytes.

Hele vores opgave går ud på at komprimere en sti udtryk som en bitsekvens op til roden på den mindst mulige plads derfor nytter det ikke noget hvis vi bruger en datatype der ikke tilpasser sig indholdet.
Avatar billede arne_v Ekspert
16. maj 2005 - 12:50 #8
En BLOB tilpasser sig også indholdet.

Men der er nok en 4 byte længde overhead på.

Hvis I bruger en normal VARCHAR2 så kan i spare lidt på overhead, men det er
ikke så pænt.
Avatar billede rasmuslh Nybegynder
16. maj 2005 - 12:53 #9
Overhead betyder det at den fylder 4 byte mere for hver tupel?

Men kan det ikke lade sig gøre at lave en bytearray om til en sekvens af chars hvor hver char svarer til en byte?
Avatar billede arne_v Ekspert
16. maj 2005 - 12:57 #10
sådan er ISO-8859-1 encoding

men hvorfor gennem en String ?

PreparedStatement setBytes må kunne bruges !
Avatar billede rasmuslh Nybegynder
16. maj 2005 - 13:04 #11
Grunden til at vi vil bruge en String er at vi laver bytearrayet om til en string så vi kan gemme det i databasen.
Og problemet er også at Java ikke har en type der hedder bits. Derfor gemmer vi den i en String.

Vi prøver lige med PreparedStatement setBytes. Gider du kigge ind lidt senere hvis det også glipper med den fremgangsmåde?
Avatar billede rasmuslh Nybegynder
18. maj 2005 - 16:52 #12
Hej Arne
Nu har vi løst det ved at lave den bitstregen til en char og derfra til en string og indsat det som en varchar.
Du har været super fin til at hjælpe så hvis du lægger et svar vil jeg gerne give point.

Mvh.
Rasmus
Avatar billede arne_v Ekspert
18. maj 2005 - 16:57 #13
hm - jeg synes nu ikke at jeg har bidraget med meget - men ok
Avatar billede arne_v Ekspert
18. maj 2005 - 17:01 #14
svar
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