Avatar billede hurra Novice
07. maj 2004 - 00:54 Der er 11 kommentarer og
1 løsning

meget data, hurtigt og uden db

Jeg er ved at lavet et program der skal kunne søge en stor mængde filer (10-30.000 filer) igennem. For hver fil er der ca 1 kb data der skal gemmes og bruges til hurtigt at kunne finde frem til filen igen.

Det er nok ikke rigtigt smart, men jeg har planer om at dette skal laves uden brug af en database, mest fordi programmet skal kunne køres på en computer uden installering.

Min plan er at gemme dataen for alle posterne i ram'en, for hurtigt at kunne søge "databasen" igennem. Dog kommer det til at tage noget tid at scanne alle filerne igennem hver gang programmet skal startes op, men det betyder ikke så meget i forhold til søgetiden. evt kan der også laves et dumb af rammen i en text fil, og mens programmet kører kan jeg opdatere listen igen.

Hvis man ser lidt "database" agtigt på det, bliver der en række koloner. Dataen i disse colonner er af blandet type, både text og tal. Jeg har planer om at lave et array til text, et til floats og et til integers.

Det er ikke alle "celler" for hver post der skal udfyldes, og de celler med text i har heller ikke samme længde.

Hvad med det array med texten i ? Er det smartest at lave det med ansistringe eller char arrays ? Er det helt skidt det jeg er i gang med ?

Jeg kunne godt bruge at par gode råd inden jeg går i gang, også lidt om hvilke fordele og nok især bagdele jeg render i ved det her.
Avatar billede arne_v Ekspert
07. maj 2004 - 01:05 #1
Det er vel ikke skidt - bare meget arbejde.
Avatar billede arne_v Ekspert
07. maj 2004 - 01:06 #2
char arrays må fylde lidt mindre end ansistrings
Avatar billede arne_v Ekspert
07. maj 2004 - 01:08 #3
Et array af void* må have nogle gode egenskaber.

Kan pege på hvad som helst.

Kan være NULL.
Avatar billede hurra Novice
07. maj 2004 - 01:15 #4
Jeg har nok lige brug for at få det med void pointer og char array forklaret. Bliver jeg ikke nødt til at definere en max størrelse af celler hvis jeg har et char array ? fx char filenavn[ANTALFILER][MAXFILNAVNLENGDE]
Avatar billede arne_v Ekspert
07. maj 2004 - 14:20 #5
Jeg tænkte på noget som:

#include <iostream>

using namespace std;

int main()
{
  int iv = 123;
  double xv = 123.456;
  char sv[] = "abc";
  void *p[3];
  p[0] = &iv;
  p[1] = &xv;
  p[2] = sv;
  cout << *((int *)p[0]) << endl;
  cout << *((double *)p[1]) << endl;
  cout << (char *)p[2] << endl;
  return 0;
}

men jeg er nu ikke nødvendigvis sikker på at det er smart.

Et array af struct lyder mere tiltaleende idag.
Avatar billede hurra Novice
08. maj 2004 - 23:51 #6
Jeg har prøvet at få noget til at køre. Men det er ikke helt godt. Det du nævner der kommer da ikek til at virke for godt. Det data der stor i p[] vil da kn være der så længe iv, xv og sv existere. Det vil vel sige at jeg skal oprette alle de poster jeg har planer om fra starten af.

Til gengæld har jeg prøvet at lave det med structs som du nævnte. Nu er jeg løbet i andre problemer. Jeg har lavet en struct:
struct mdb
{
  int Index;
  AnsiString FileName;
  int FileSize;
  float NogetAndet;
};
og oprettet en blobal variabel:
mdb *testdb;
int dbsize = 0;

Så har jeg lavet en funktion til at tilføje data, men her kommer prøblemerne:
bool TForm1::AddData(AnsiString FileName, int FileSize, float NogetAndet)
{
  testdb[dbsize].Index = dbsize;
  testdb[dbsize].FileName = FileName;
  testdb[dbsize].FileSize = FileSize;
  testdb[dbsize].NogetAndet = NogetAndet;
  dbsize++;
  delete testdb;
  testdb = new mdb[dbsize];
}
Når jeg sletter testdb, og opretter den igen, kan jeg ikke være sikker på den kommer til at ligge samme sted i hukommelsen, og derved vil dataen ikke være den samme.
Så jeg har prøvet at ha en midlertidig variabel af typen mdb. Men det er ikke helt godt:
  mdb *tp=new mdb[dbsize];
  tp = testdb;
  delete testdb;
  testdb = new mdb[dbsize++];
Det virker jo ikke så godt at flytte hele "databasen" på den måde. Men hvorfor er det at jeg ikke kan kopiere posterne enkeltvis med:
for(int i=0; i<dbsize; i++)
  tp[i] = testdb[i];
Jeg skal vel ha defineret at operatoren = skal copiere dst.FileName = src.FileName; osv.
Avatar billede arne_v Ekspert
09. maj 2004 - 00:28 #7
Jeg ser 2 muligheder:

1) alloker 100 elementer
  fyld de første 100 op
  alloker 200 elementer
  kopier med memcpy de 100 elementer
  fyld de næste 100 op

2) brug en data struktur som en linked liste eller lignende f.eks. STL vector
Avatar billede segmose Nybegynder
10. maj 2004 - 12:36 #8
STL map
Avatar billede hurra Novice
25. maj 2004 - 16:53 #9
Nu har jeg lavet noget der virker, men det er ikke overhovedet så smart som jeg havde troet. Jeg skal vidst til at kikke lige på linked lister for at få det til at køre ordentligt, men det bliver ikke lige lige nu.

I stedet for er jeg faldet over libmysqld, en embedded version af mysql. Det lyder til at kunne alle de ting jeg har brug for, og virker uden installation af noget database først.

Men her jeg jeg så endnu en gang løbet i problemer, http://www.eksperten.dk/spm/502408.

Men tak for din hjælp arne_v. Du skal ha nogle points for nogle gode råd, Sender du et svar.

Selv om det ikke kom til at virke som jeg havde forstillet mig, lærte jeg noget i lige godt.
Avatar billede arne_v Ekspert
25. maj 2004 - 17:00 #10
svar
Avatar billede arne_v Ekspert
16. juni 2004 - 23:33 #11
??
Avatar billede hurra Novice
24. juni 2004 - 07:23 #12
Undskyld, jeg har desværre midstet nogle mails fra en periode, så jeg har fået besked om din sidste kommentar fra den sidste du sendte. Undskyld vendte tiden.
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