Und danke im Voraus für die Hilfe.
Hintergrund - Ich schreibe ein PHP-Skript, das herausfinden muss, welches Ziel der Anrufer erreichen möchte. Telefoniervorwahlen sind Zeichenfolgen, die ein Ziel identifizieren. Das Programm muss für jeden Anruf die längste Präfix finden, die mit der Zeichenfolge übereinstimmt. Zum Beispiel würde die Nummer 30561234567 von 305, aber nicht von 3057 oder 304 übereinstimmen. Wenn 3056 existierte, wäre dies das bevorzugte Ergebnis.
Nachdem ich mehrere Datenstrukturen untersucht habe, scheint ein Baum, in dem jeder Knoten eine Ziffer speichert und Verweise auf die anderen 10 möglichen Optionen enthält, ideal zu sein. Dies könnte als Array von Arrays implementiert werden, in dem das Skript 3 überprüfen könnte, ein Array dort finden, dann 0 in diesem neuen Array überprüfen könnte, ein weiteres Array finden und so weiter, bis es einen Wert anstelle eines Arrays findet. Dieser Wert wäre die Ziel-ID (die Ausgabe des Skriptes).
Anforderungen - Leistung ist absolut kritisch. Die Zeit, die für die Überprüfung dieser Präfixe aufgewendet wird, verzögert den Anruf, und jeder Server muss eine große Anzahl von Anrufen verarbeiten, daher muss die Datenstruktur im Speicher gespeichert werden. Es gibt derzeit ungefähr 6000 Präfixe.
Problem - Das Skript wird jedes Mal ausgeführt, wenn der Server einen Anruf empfängt, daher müssen die Daten in einem Cache-Server von irgendeiner Art gespeichert werden. Nachdem ich memcached und APC (Advanced PHP Cache) überprüft habe, habe ich mich entschieden, APC zu verwenden, weil es [viel schneller][3] ist (es handelt sich um einen lokalen Speicher).
Das Problem, das ich habe, ist, dass das Array von Arrays bis zu 10 Ebenen tief werden kann und eine sehr komplexe Datenstruktur darstellt, die, wenn ich sie als Objekt dem Cache hinzufüge, lange Zeit braucht, um deserialisiert zu werden.
Wenn ich jedoch jedes einzelne Array einzeln in den Cache hinzufüge (mit einer logischen Namensstruktur, um es einfach finden zu können, z.B. 3 für Array 3, dann 30 für Array 30, 305 für das Array, das diesen Pfad folgt usw.), muss ich verschiedene Arrays mehrmals aus dem Cache abrufen (bis zu 10 pro Anruf), was dazu führt, dass ich den Cache zu oft treffe.
Gehe ich das Richtige an? Vielleicht gibt es eine andere Lösung? Oder ist eine der von mir vorgeschlagenen Methoden der anderen überlegen?
Danke für Ihre Meinung,
Alex
0 Stimmen
Was wäre die maximale Länge der gespeicherten Präfixe?
0 Stimmen
Die meisten Präfixe sind 6 bis 10 Ziffern lang, die längsten können 15 Ziffern erreichen