Wörterbuch speichern



  • Hiya,

    ich wollte eigentlich fragen, wie man auf simpelste Weise eine Art Wörterbuch speichern kann, doch dann is mir was eingefallen und ich will nun hören was ihr davon haltet.

    Die Einträge sind in folgender Form:

    Syntax: <key>:<description>
    Beispiel: Linux:(Betriebssystem-)Kernel der von Linus Torvalds anfang der 90er Jahre geschrieben wurde

    und sollen in (einer) Datei/Dateien gespeichert werden.
    Die Frage ist nun, wie legt man das ganze in Dateien ab, so, dass man ein bestimmten Eintrag schnell wiederfindet. Natürlich sollten Einträge auch einfach hinzugefügt, gelöscht und editiert(naja, is mehr oder weniger löschen und neu hinzufügen) werden.

    Das ist also mehr oder weniger das Problem 😉

    Das Programm soll ja das Wörterbuch zur Verfügung stellen; es stellt sich also die Frage ob alles in den Speicher geladen wird(und wenn, wie genau? einfach verkettete Liste?) oder von der Festplatte gelesen wird.

    Meine Idee wäre nun folgende:

    Das Wörterbuch wird nicht in den Speicher geladen.
    Das Wörterbuch besteht aus mehreren, je nach Wörterbuchgröße, sehr vielen einzelenen Dateien in einem besimmten Verzeichnis.
    Die einzelnen Dateien sind von ihrem Namen nicht länger als 3 Zeichen.
    Der Name einer einzelnen Datei, also diese 3 Zeichen, kennzeichnen die 3 Anfangsbuchstaben von den Keys in der Datei.

    Beispiel:

    Also, angenommen das Verzeichnis mit den einzelnen Dateien lautet db/ und unser Beispieleintrag ist der von oben.

    Hinzufügen eines Eintrags
    - die ersten 3 Buchstaben von "Linux" werden in einer Variablen gespeichert, dabei werden die Buchstaben in Kleinbuchstaben umgewandelt.
    - es wird die Datei "db/lin" so geöffnet(append), dass Daten am Ende der Datei hinzugefügt werden können.
    - der Eintrag Linux (also folgende Zeile: "Linux:(Betriebssystem-)Kernel der von Linus Torvalds anfang der 90er Jahre geschrieben wurde\n") wird in die Datei geschrieben.

    Suchen eines Eintrags
    - vom key werden wieder die ersten 3 Buchstaben kopiert und in Kleinbuchstaben umgewandelt. Es wird versucht die entsprechende Datei in db/ zu öffnen. Gelingt dies, werden die ganzen Einträge dort nachdem key durchsucht(Zeilenweise einlesen, parsen, vergleichen...)

    Löschen eines Eintrags
    - es wird wie beim Suchen verfahren, jedoch werden die einzelnen Einträge in eine verkettete Liste geladen, der bestimmte Eintrag wird gelöscht und die übriggebliebenen werden wieder in die Datei geschrieben.

    ------

    Dies wäre also das Grundkonzept meiner Idee.
    Es stellt sich natürlich auch die Frage, was passiert, wenn ein Key nicht länger als 3 Buchstaben, ja sogar kürzer, ist. In dem Fall besteht dann der Dateiname aus 2, oder sogar aus einem Zeichen.
    Ich hab die 3 Zeichen einfach so gewählt, man könnte natürlich auch nur die ersten 2 Zeichen benutzen(dann wären es insgesamt weniger Dateien, aber mehr Einträge in diesen)

    Nun will ich euch mal zeigen wie mein Wörterbuchverzeichnis aussieht 😃 :

    133  arc  bit  cac  css  dnd  fps  gif  iac  ker  mic  np   pop  scn  tld  wip
    2k   asa  bmp  cd   cu   dns  fra  gim  ic   kh   mim  omf  por  sco  ttt  wm
    acc  asc  bnc  ceb  cvs  dpi  fre  gnu  icq  kis  mir  omg  ppp  sec  tux  wt
    ack  atm  boo  ceo  cya  dsl  fs   gop  imo  kma  mng  oop  qua  sel  u2   wtf
    ad   ava  bot  cgi  dat  dvd  ftp  gpl  ip   kp   mom  ope  re   sms  ud?  wws
    ads  avi  bou  cli  dau  emo  fu   gth  ipx  kry  mon  os   red  smt  uni  www
    afa  ayo  bps  cmi  db   enc  fyi  han  irc  lan  mot  ot   rfc  sos  url  wys
    afk  ays  brb  cod  ddr  eod  ga   hdd  isd  lil  n8   p2p  rip  ssl  usb  xdm
    aka  bac  bro  com  de   eof  gat  hel  isp  lin  nac  pat  rl   sta  use  xht
    ans  ban  bsd  coo  deb  eom  gb   hol  jic  lmk  ner  pc   rms  stf  vl   xml
    aol  bbl  btw  cou  dhc  esm  gcc  how  jk   lol  nfs  php  rn   suf  vrr  xmm
    api  bbs  bug  cpu  dht  faq  gdm  htm  jpe  lrs  ng   pix  rof  sus  w3c  yam
    apm  bcc  byt  cr-  dis  fbb  gee  htt  ka   m$   nic  ple  rot  tal  way  yas
    app  bet  c    cra  diy  fil  gen  hur  kb   mac  nmp  pn   rtf  tcp  wb   you
    apt  bio  c++  cs   dm   fla  gg   hz   kdm  man  nnt  png  rtm  thx  win
    

    hat was, oder? *g*

    Man kann sich ja selber ausrechnen, wieviel Dateien es maximal werden könnten, wenn man "3 Zeichen" nimmt.
    Man sieht schon auf den ersten Blick, dass in der Datei "c" und "c++" wahrscheinlich nur ein einziger Eintrag ist.
    Die Suche nach den Einträgen wird also mehr oder weniger dem OS/Filesystem überlassen.
    Es kann natürlich kritisch werden, wenn Sonderzeichen in den Keys enthalten sind...dies müsste beim hinzufügen jeweils geprüft werden.

    Weiterhin könnte man eine Art Index Datei anlegen, wo nur die keys aufgelistet sind, so hat man dann wenigstens einen kleinen Überblick, was alles enthalten ist.

    Meine Idee hat also mehrere Nachteile:

    - viele kleine verteilte Dateien -> Unordnung...(Belastung des OS/Filesystems?)
    - es kann nur nach Keys gesucht werden (naja, könnte man ändern, wäre aber in diesem Fall sehr aufwendig!)
    - schlechte Verteilung der Einträge(in einer Datei 1 Eintrag, in anderer mehr als 10...)
    - keine zusätzlichen Infos(von wem hinzugefügt, wann) - Nun ja, könnte man noch dazu machen 😉

    und wahrscheinlich noch paar andere...

    Vorteile:

    - soweit ich das beurteilen kann, wird ein Eintrag relativ schnell gefunden
    - Programm benötigt nicht "viel" Speicher, geringe Anforderungen an Speichermanagment...
    - es werden keine (exotischen) Libs benötigt, damit keine Programmabhängigkeiten
    (- man hat alles in einem Verzeichnis, was nur für den Zweck existiert)

    Mehr fallen mir im Moment nicht ein.

    Nun fragen an euch:

    (1) Was haltet ihr davon?
    (2) Wie könnte man das ganze Verbessern? Also auch Suche in den Beschreibungen...Auflistung der Einträge nach Autoren/Hinzufügungsdatum etc...
    (3) Was gibt es für Alternativen ohne Datenbanken oder derartiges zu verwenden? / Wie würdet ihr es machen?

    Danke für die Aufmerksamkeit 😉



  • ich würde zu sqlite greifen, du kanns sie in dein programm hinein linken und einfach die funktionen benutzen, der user muss keine db oder sonstiges installieren
    ich hatte innerhalb von 1 h schon was fertiges gehabt
    die vorteile von sqlite gegenüber deiner lösung,

    • es gibt externe tools mit den du auf die db zugreifen kannst
    • später kann man leicht eine client-server architecktur aufbauen
    • sql ist mächtig
    • du kannst von sehr vielen programiersprachen auf die db zugreifen
    • es wird dir sehr viel arbeit abgenommen

    sqlite steht unter einer bsd lizenz du kannst es also ohne probleme in deinen closed source programmen benutzen

    nachteile sind: dein programm wird größer


Log in to reply