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 wurdeund 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 machenund 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