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 question
struttura 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?
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;)