Hi Daniela
Zumal dein Lösungsansatz ja zusätzlich auch noch massig HD verbrauchen würde·
Nö wieso, ich habe bereits vorgerechnet dass es IMHO deutlich dichter ist als alles bisherige. https://forum.selfhtml.org/?t=97702&m=595156 oder https://forum.selfhtml.org/?t=97702&m=595277
(deine (großzügigere) Rechnung lieferte 230MB gegenüber 8GB DB-Volumen) Pro Matrixwert fällt nur die Referenz aufs Posting an. 4 Bytes pro Referenz sind da für mich das Maximum, insbesondere weil man's ohne große Performanceverluste weiter eindampfen könnte.
Du hinterlegst die ersten 500 bytes jedes Postings in der DB?
Das sind unkomprimiert 300MB Daten, lohnt sich das?Imho ja. Dadurch verhindert man, eine Datei öffnen zu müssen und an die entsprechende Stelle springen zu müssen. Beides ist sehr teuer.
Eine Hash-Funktion (von en. "to hash": zerhacken, dt. Bezeichnung: Streuwertfunktion) ist eine nicht umkehrbare Funktion (ein Algorithmus), die eine umfangreiche Quellmenge (i.d.R. Texte) auf eine wesentlich kleinere Zielmenge (Hash-Werte, i.d.R. natürliche Zahlen und Buchstaben) abbildet."
Nicht jede Hash-Funktion ist für eine Hashtable nutzbar.
Ich sagte "Das zurückführen eines Wortes auf seine lower()-Variante kann man übrigens auch als primitive und effiziente Hashfunktion interpretieren"
Der Wert einer Hashfunktion ist nicht notwendigerweise ein Pointer in ein Array, hier wird die lower-Variante als Key einer kleineren Suchtabelle genutzt, und später die Kollision aufgelöst.
Nichts anderes machst du übrigens, wenn du statt ganzer Phrasen nur die Einzelwörter suchst, und die Kollisionen
(Einzelwörter in falscher Reihenfolge) später wegwirfst.
Das Prinzip ist das gleiche.
Das ist nach wie vor keine Hashfunktion wie sie bei einer Hashtabelle irgendwie brauchbar wäre...
wie gesagt "primitive Hashtabelle".
Autsch, du willst die Datei also dauerhaft geöffnet halten?
Was die performanteste Lösung fürs Filesystem ist weiß ich nicht, da die DB sowieso einen _noch_ größeren Teil seiner Daten ebenfalls ausgelagert hat, kann man entweder mit einer vergleichbaren Zugriffstechnik arbeiten oder -falls es sich rechnet- dafür eine DB nutzen.
Viel Spass, ich hab dir ja vorgerechnet, wie gross das dann wird...
Wie gesagt, es kann nicht größer werden als Michaels Vollindex oder deine DB, eher deutlich kleiner, selbst wenn alle Hashes halb besetzt sind. Und nur was ins RAM passt, soll da auch rein.
Ein Werte ist dabei eine Liste von Referenzen auf Postings, wird nach mehreren Schlüsselwörtern gesucht, duchsucht man im 2.Schritt nur die Schnittmenge dieser Listen.
Die zu bilden ist übrigens auch sehr witzig...
och - erster Ansatz - aufsteigendes vorsortieren aller Postingreferenzen sollte locker reichen. (Dann kann man auch mit Differenzen arbeiten um die Datendichte zu erhöhen²) Falls das zu langsam wäre könnte man sicher genug Literatur zum Thema finden.
Gruss
Rolf
²bei 600000 Postings aktuell, würde es reichen dass ein Wort mehr als 10 mal "regelmäßig" auftaucht, damit man den Abstand zum nächsten "Treffer" mit 2 Bytes kodieren könnte. Also gerade große Listen ließen sich sehr gut eindampfen.