Struttura dei dati ottimale per la nostra API


10

Sono nelle prime fasi della stesura di una modalità principale Emacs per la rete Stack Exchange ; se usi Emacs regolarmente, questo alla fine ti gioverà.

Al fine di ridurre al minimo il numero di chiamate effettuate all'API di Stack Exchange (limitato a 10000 per IP al giorno) e di essere solo un cittadino generalmente responsabile, voglio memorizzare nella cache le informazioni che ricevo dalla rete e archiviarle in memoria, in attesa di accedere di nuovo. Sono davvero bloccato sulla struttura dei dati in cui archiviare queste informazioni.

Ovviamente, sarà un elenco. Tuttavia, come con qualsiasi struttura di dati, la scelta deve essere determinata da quali dati vengono archiviati e da come accedervi. Cosa, vorrei essere in grado di memorizzare tutte queste informazioni in un singolo simbolo come stack-api/cache. Quindi, senza ulteriori indugi, stack-api/cacheè un elenco di aspetti chiave dell'ultimo aggiornamento:

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

dove <csite>sarebbe

(1362501715 . <site>)

A questo punto, tutto ciò che abbiamo fatto è definire un semplice elenco di associazioni . Certo, dobbiamo andare più a fondo .

Ciascuno <site>è un elenco del parametro API (unico) seguito da un elenco di domande:

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

Ognuno <cquestion>è, hai indovinato, una contro di domande con il loro ultimo aggiornamento:

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

<question>è un contro di una questionstruttura e un elenco di risposte (ancora una volta, rispettate l'ora dell'ultimo aggiornamento):

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

e `

`(1362501715 . <answer-structure>)

Questa struttura di dati è probabile che la maggior parte accuratamente descritto come un albero, ma non so se c'è un modo migliore per fare questo considerando il linguaggio, Emacs Lisp (che non è poi così diverso dal Lisp che conosci e ami affatto ) . I contro espliciti sono probabilmente inutili, ma aiuta il mio cervello a avvolgerlo meglio. Sono abbastanza sicuro che <csite>, per esempio, si trasformerebbe in

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

preoccupazioni:

  • La memorizzazione di dati in una struttura potenzialmente enorme come questa ha qualche compromesso prestazionale per il sistema? Vorrei evitare di archiviare dati estranei, ma ho fatto quello che potevo e non penso che il set di dati sia così grande in primo luogo (per un uso normale) poiché è tutto solo testo leggibile dall'uomo in proporzione ragionevole. (Sto pianificando di eliminare i vecchi dati usando i tempi in testa all'elenco; ognuno eredita il suo ultimo aggiornamento dai suoi figli e così via lungo l'albero. Fino a che punto dovrebbe avere luogo questo abbattimento: non lo sono sicuro.)
  • L'archiviazione di dati come questo ha qualche compromesso in termini di prestazioni per ciò che deve usarli? Cioè, le operazioni di impostazione e recupero risentiranno delle dimensioni dell'elenco?

Hai altri suggerimenti su come potrebbe apparire una struttura migliore?


Lo sto facendo +1 perché voglio davvero questa modalità
Daniel Gratzer il

@jozefg Lo voglio davvero anche io: questo tirocinio mi ha risucchiato per la maggior parte del tempo, ma una volta avviata la scuola dovrebbero essere fatti ulteriori progressi .
Sean Allred,

Sono stato abbastanza felice solo installando un plug-in del browser che mi consente di utilizzare Emacs per compilare il contenuto della casella di testo. Emacs comprenderà il markup Wiki e visualizzerà il testo formattato?
Kevin Cline,

@kevincline No, l'idea è che svolgerà solo compiti utilitaristici: archivio di domande locali; modifica avanzata del codice (avvio nella giusta modalità principale, simile a org); inserimento <!-- language: blah>ove necessario (a seconda della modalità di modifica del codice); roba del genere. Vedere il file README su GitHub per maggiori informazioni, e si sentono più benvenuti a suggerire funzionalità. Più ne so prima, meglio può essere progettato. modifica per non parlare delle combinazioni di tasti di emacs;)
Sean Allred,

Risposte:


1

Emacs lisp non è ottimizzato per l'elaborazione dei dati; potresti trovare vantaggioso usare un Common Lisp per il motore ed Emacs solo per la presentazione.

Anche se decidi di restare con Emacs Lisp, ti suggerisco di usare dati strutturati ( eieio) invece di liste e tabelle di hash invece di liste.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.