Optimale Datenstruktur für unsere eigene API

10

Ich bin gerade dabei, einen Emacs-Hauptmodus für das Stack Exchange-Netzwerk zu schreiben . Wenn Sie Emacs regelmäßig verwenden, profitieren Sie am Ende davon.

Um die Anzahl der Aufrufe der API von Stack Exchange (maximal 10000 pro IP und Tag) zu minimieren und nur ein allgemein verantwortlicher Bürger zu sein, möchte ich die vom Netzwerk empfangenen Informationen zwischenspeichern und im Speicher speichern und darauf warten erneut zugegriffen werden. Ich bin wirklich nicht sicher, in welcher Datenstruktur diese Informationen gespeichert werden sollen.

Offensichtlich wird es eine Liste sein. Wie bei jeder Datenstruktur muss die Auswahl jedoch davon abhängen, welche Daten gespeichert werden und wie auf sie zugegriffen wird. Was, ich möchte in der Lage sein, alle diese Informationen in einem einzigen Symbol wie zu speichern stack-api/cache. Also, ohne weiteres, stack-api/cacheist eine Liste der Nachteile, die durch das letzte Update verschlüsselt wurden:

`(<csite> <csite> <csite>)

wo <csite>wäre

(1362501715 . <site>)

An dieser Stelle haben wir lediglich eine einfache Zuordnungsliste definiert . Natürlich müssen wir tiefer gehen .

Jedes <site>ist eine Liste der API-Parameter (eindeutig), gefolgt von einer Listenfrage:

`("codereview" <cquestion> <cquestion> <cquestion>)

Jedes <cquestion>ist, Sie haben es erraten, ein Nachteil von Fragen mit ihrer letzten Aktualisierungszeit:

`(1362501715 <question>) (1362501720 . <question>)

<question>ist ein Nachteil einer questionStruktur und eine Liste von Antworten (wiederum berücksichtigt mit ihrer letzten Aktualisierungszeit):

`(<question-structure> <canswer> <canswer> <canswer>

und `

`(1362501715 . <answer-structure>)

Diese Datenstruktur ist wahrscheinlich am genauesten als Baum beschrieben, aber ich weiß nicht , ob es eine bessere Art und Weise ist das die Sprache unter Berücksichtigung zu tun, Emacs Lisp (die so verschieden von der Lisp nicht alles , was Sie wissen und Liebe überhaupt ) . Die expliziten Nachteile sind wahrscheinlich unnötig, aber es hilft meinem Gehirn, sich besser darum zu kümmern. Ich bin mir ziemlich sicher <csite>, dass aus einem zum Beispiel einfach etwas werden würde

(<epoch-time> <api-param> <cquestion> <cquestion> ...)

Bedenken:

  • Hat das Speichern von Daten in einer potenziell großen Struktur wie dieser Leistungskompromisse für das System? Ich möchte vermeiden, fremde Daten zu speichern, aber ich habe getan, was ich konnte, und ich glaube nicht, dass der Datensatz überhaupt so groß ist (für den normalen Gebrauch), da alles nur von Menschen lesbarer Text in angemessenem Verhältnis ist. (Ich habe vor, alte Daten anhand der Zeiten am Anfang der Liste zu löschen. Jeder erbt seine letzte Aktualisierungszeit von seinen untergeordneten Elementen und so weiter im Baum. Inwieweit sollte diese Löschung stattfinden: Ich nicht sicher.)
  • Hat das Speichern solcher Daten Leistungskompromisse für das, was sie verwenden muss? Das heißt, werden das Setzen und Abrufen von Vorgängen unter der Größe der Liste leiden?

Haben Sie weitere Vorschläge, wie eine bessere Struktur aussehen könnte?

Sean Allred
quelle
Ich bin + 1ing dies, weil ich diesen Modus wirklich will
Daniel Gratzer
@jozefg Ich möchte es auch wirklich - dieses Praktikum hat die meiste Zeit meiner Zeit in Anspruch genommen , aber sobald die Schule beginnt, sollten weitere Fortschritte erzielt werden .
Sean Allred
Ich war ziemlich glücklich, nur ein Browser-Plugin installiert zu haben, mit dem ich Emacs zum Ausfüllen von Textfeldinhalten verwenden kann. Lassen Sie Emacs das Wiki-Markup verstehen und den formatierten Text anzeigen?
Kevin Cline
@kevincline Nein, die Idee ist, dass es nur nützliche Aufgaben erledigt: Archivierung lokaler Fragen; erweiterte Code-Bearbeitung (Ausblenden in den richtigen Hauptmodus, ähnlich wie org); <!-- language: blah>gegebenenfalls Einfügen (abhängig von dem Modus, in dem die Codebearbeitung durchgeführt wurde); solche Sachen. Siehe README auf GitHub für weitere Informationen, und fühlen sich am meisten willkommen Features vorzuschlagen. Je mehr ich vorher darüber weiß, desto besser kann es gestaltet werden. bearbeiten , um Emacs Tastenkombinationen nicht zu erwähnen;)
Sean Allred

Antworten:

1

Emacs lisp ist nicht für die Datenverarbeitung optimiert. Möglicherweise ist es vorteilhaft, ein Common Lisp für die Engine und Emacs nur zur Präsentation zu verwenden.

Selbst wenn Sie sich für Emacs Lisp entscheiden, empfehle ich Ihnen, strukturierte Daten ( eieio) anstelle von Listen und Hash-Tabellen anstelle von Alisten zu verwenden.

sds
quelle