SQLite nicht gut? Ist es eine entfernte DB auf einem anderen Rechner?
So viel ich weiß bietet fast jede DB auch einen ODBC connector oder wie das heisst an, und soviel ich weiß gibt es ODBC sogar für Linux. Das wäre etwas umweghaft aber gehbar. SQLite wird i.d.R. für kleinere Projekte benutzt, da ist die gesammte DB in einer Datei untergebracht, und kann auch im Speicher gespiegelt werden bzw. gibt es einige Features. Auch lässt sich SQLite "einfach" ein wenig erweitern; du kannst hier dein eigenenes "Dateisystem" zusammenbrauen und einbinden, oder eigene SQL-Hilfsfunktionen (z.B. eine md5(..) Procedure für die sql-Abfragen zugänglich machen). Für SQLite brauchst Du auch keine lokale Installation, Treiber usw, nicht mal die DLL - im Gegensatz zu allen anderen.
Wer Folgendes lesen möchte, ist wohl ein wenig zu neugierig
Ich bin gerade dabei mir meine eigene "NoSQL Micro-DB" zu schreiben. Ein abgetippter bzw. portierter (C) AVL Tree war das mal, der etwas groß gewachsen ist

Habe erst später gemerkt, dass es auch in den Foren PB Beispiele gegeben hat, aber ich wollte ein wenig learning-by-doing machen.
Für BTrees bin ich ein wenig zu doof, da ich keinen Source zum Abtippen bzw. Portieren gefunden habe

Eigentlich wollte ich einen Region-Tree erst bauen, bin aber davon irgendwie abgekommen.Das ist leider schon "etwas" komplizierter als eine Doubly Linked List, z.B.

Weil ich wollte einen Quadtree komplett neu denken. Weil ich mir eine eigene GUI schreiben wollte. Weil das ist schon ca. ein Jahr her, und ich habe vergessen wo das alles hinführen sollte, achja eine coole "einfache" GUI naja

So ist es eben mit dem "einfach" und "irgendwann"...
Erst gestern habe ich es geschafft! (Wie der Zufall so spielt). Ich will auf folgendes abzielen: eventuell SQL und PB Strutktur definitionen austauschbar nutzen. Strukturen direkt speichern/laden/alloziieren ein bisschen wie in den ExtractStructure Befehlen bei der XML und JSON Lib. Ich habe da an anderer Stelle etwas halbwegs Brauchbares zusammengebraut.
Derzeit wäre die "avl db" aber noch etwas langsam bei "offline" Zugriffen, kann selbstverständlich noch kein SQL, und sowieso gibt es nur einen Demo code für einen Demo Datentyp bzw. Struktur. Daher werde ich noch alles ein weiteres Mal aufkrempeln müssen (bin bei Implementation 5 und 6).
Ich benutze Key-Pair (Implementation 5) der Key ist immer ein Quad, entspricht also einer "RowID" wenn man so will. Schnell und "inline" sortiert. Nummer 6 ist ein User-übergebener Strukturpointer, mit benutzer-definierter Sortierfunktion. Das wäre also genau etwas, was Du bräuchtest - allerdings noch leider nicht ausgereift bzw. in einer nutzbaren Form vorhanden.
Das ganze ist noch sehr Callback-lastig und in den "Kinderschuhen", weil ich mich erst auf die RAM-Seite des AVL-Trees ausschließlich beschränkt habe.
Aber in den nächsten implementationen werde ich das neue DB Dateiformat definieren, vermutlich ein wenig von SQLite inspiriert alles in eine Datei packen, unverschlüsselt um Zeit und komplexität zu sparen) und ein Seiten Cache einbinden müssen, damit es "offline" wie "online" schneller und vor allem dynamisch funzt. Das an sich selbst ist aber schon eine komplexe Sache, bei der ich dann viel mit Thread-sicherer Programmierung experimentieren müsste. Und Write Ahead Logging oder wie das heisst muss es auch geben - "nur" als Option

. Ich dachte aber dennoch sollte es eine Single-User DB sein, jedenfalls je Rechner. Ich fantasiere schon größenwahnsinnigerweise das ganze clusterisierbar zu machen mit up/downstream servern aber ich riskiere hier einen geistige Burnout dabei, wenn ich zuviel denke und zu wenig probiere.
Es lässt sich die "Demo DB" offline auslesen. "Online" bedeutet so wie ich es hier meine: der komplette AVL Tree ist im RAM der Applikation wieder hergestellt, mit Struktur-pointern und allozierten Strings etc. Das habe ich relativ schnell, aber auch RAM lastig, hinbekommen.
Zeit Faktoren sind
2 Mio Zufalls-Strings etc. generieren = 1
Das Ganze laden = 1,5 - 2
Das Ganze speichern = ?? Ich vermute zwischen 1 und 1,5 aber es könnte derzeit etwas länger sein (mehr Dateioperationen als optimal)
Auf dem Raspi ist der Zeitfaktor ca. 10x wie auf meinem Desktop PC, von der Geschwindigkeit her, Pi mal Daumen die gleichen Zeit-Verhältnisse, ich vermute es ist relativ Schnuppe ob es eine SSD oder mechanische ist weil ich lade die "DB" in einem Durchgang rein und raus, daher wird auch viel RAM benutzt um erst die Datei dort vollständig rein zu laden. Ich muss schauen in welche Richtung sich das entwickeln soll, mutable unmutable DB und so, oder mein eigenes Hexengebräu mit Nebenwirkungen. Derzeit wäre das Democode-Format unmutable, so wie ich es verstehe. Also man kann nur schwer wieder etwas entfernen, aber (der Begriff mag verwirren) jederzeit etwas hinzufügen. Einen Delete Flag oder sowas habe ich auch nicht eingebaut. Ist nur ein Baum je Datei derzeit (aber theoretisch mehrere), so als fixes Game-Save Format, oder benutzerdefiniertes Datei-Archiv "leicht" nutzbar (3 Callbacks je Baum für Laden+Speichern, dann noch 1 oder 2 um "online" neue Elemente anzulegen bzw. bei einem delete wieder den Speicher zulären (aka Allocate & ClearStructure). Das ganze lässt sich aber abstrahieren und dann wrappen, was einer der nächstes Schritte wäre für Implementationen 7 und 8, wenn ich es anpacken sollte.
ca. 216 MB (AvlTree5) und 150MB (AvlTree6) bei 2 mio ID+strings ("Node #11234 blabla" artige strings), weil die generierten Strings bei etwas unterschiedlicher sind. Ladezeiten liegen auf dem PC bei ca. 2 Sekunden und bein Raspi also ca. 20s. Sorry falls das unpräzise ist, das sind nur grobe Richtwerte aber ich denke es ist immer nützlich sich etwas Feeling anzueignen.
Overhead sind 50-60 bytes je Node und ungefähr genauso viel für den Datei-Header. Alle größen-Angaben und Datei-Offsets sind in 64bit Quads, sodaß auch sehr große Dateien möglich wären, aber eben auch der Overhead erzeugt wird; Im RAM ist der Overhead auf 64bit quasi identisch, auf 32bit kleiner (es werden 2 zusätzliche Pointer im Vergleich zu klassischen AVL Trees zusätzlich benötigt, um aus dem AVL Tree eine implizierte Linked-List zu machen; d.h. man kann den AVL Tree auch als Priority list oder LL benutzen, welche eine andere "Sortierung" hat als die ID's, aber wied gesagt der Baum ist schon dick gewachsen und aufgepeppelt). Wenn der Baum im RAM "entpackt" ist, geht es kaum schneller - insbesondere bei den ID-*Structure Vergleichen. Bei den nächsten Implementationen werde ich aber noch mehr rausziehen können, glaube ich ^^ Es geht mit implementierter Linked List ca. 10-20% langsamer, wenn nach ID/benutzerdefiniertem Callback sortiert wird; aber wenn zum "Listen" Anfang oder Ende hinzugefügt bzw. inserted wird, ist der Zeit-Overhead quasi bei 0, es wird aber mehr Zeit benötigt um seites PB/OS die 2 zusätzlichen Pointer zu allozieren (mehr Speicher) und diese größere Struktur zu nullen (bei FreeMemory bzw. AllocateMemor). Das spielt also auch da rein, ist aber vernachlässigbar wenn man eine LL haben will. Und das ist cool, weil erst mit dem BTree angeblich LL's implizit sind, geht aber auch mit einem modifizierte AVL ganz einfach, wie ich beim experimentieren rausgefunden habe
Wenn ich was Präsentierbares habe werde ich gerne hier damit prahlen

Ich denke dass wir hier ein überschneidendes Interesse haben, aber nunja die perfekte DB kenne ich auch nicht (SQLite fand ich überraschend langsam, aber ich denke es liegt auch an den standart Optionen, meiner Unwissenheit und hohen Ansprüchen).
Wenn Du bestimmte Ideen oder Features wünschst, die auch in meine Richtung gehen, immer her damit - ich könnte auch auf Inspiration und Erfahrungen von anderen gerne zurrückgreifen.
