Estrutura de dados ideal para nossa própria API


10

Estou nos estágios iniciais de escrever um modo principal do Emacs para a rede Stack Exchange ; se você usa o Emacs regularmente, isso irá beneficiar você no final.

Para minimizar o número de chamadas feitas para a API do Stack Exchange (limitado a 10000 por IP por dia) e ser apenas um cidadão geralmente responsável, desejo armazenar em cache as informações que recebo da rede e armazená-las na memória, aguardando ser acessado novamente. Estou realmente preso quanto à estrutura de dados para armazenar essas informações.

Obviamente, será uma lista. No entanto, como em qualquer estrutura de dados, a escolha deve ser determinada por quais dados estão sendo armazenados e como serão acessados. Gostaria de poder armazenar todas essas informações em um único símbolo, como stack-api/cache. Portanto, sem mais delongas, stack-api/cachehá uma lista de consentimentos codificados pela última atualização:

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

onde <csite>estaria

(1362501715 . <site>)

Neste ponto, tudo o que fizemos foi definir uma lista de associação simples . É claro que devemos ir mais fundo .

Cada <site>um é uma lista do parâmetro da API (exclusivo) seguido de uma lista de perguntas:

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

<cquestion>Você adivinhou que cada uma é um contras de perguntas com a última atualização:

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

<question>é um contras de uma questionestrutura e uma lista de respostas (novamente, concordadas com o último horário de atualização):

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

e `

`(1362501715 . <answer-structure>)

Esta estrutura de dados é provável mais precisamente descrita como uma árvore, mas eu não sei se há uma maneira melhor de fazer isso considerando a linguagem, Emacs Lisp (que não é tão diferente do Lisp que você sabe e amor em tudo ) . Os consentimentos explícitos são provavelmente desnecessários, mas ajudam meu cérebro a envolvê-lo melhor. Tenho certeza de que <csite>, por exemplo, apenas se tornaria

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

Preocupações:

  • O armazenamento de dados em uma estrutura potencialmente grande como essa tem alguma compensação pelo desempenho do sistema? Gostaria de evitar o armazenamento de dados estranhos, mas fiz o que pude e não acho que o conjunto de dados seja tão grande em primeiro lugar (para uso normal), pois é apenas texto legível por humanos em proporção razoável. (Estou planejando selecionar dados antigos usando os horários no início da lista; cada um herda sua última hora de atualização de seus filhos e assim por diante na árvore. Até que ponto esse abate deve ocorrer: eu não estou certo.)
  • O armazenamento de dados como esse tem algum problema de desempenho para o que deve ser usado? Ou seja, as operações de configuração e recuperação sofrerão com o tamanho da lista?

Você tem outras sugestões sobre como seria uma estrutura melhor?


Estou adicionando +1 a isso porque realmente quero esse modo #
Daniel Gratzer

@jozefg Eu realmente quero isso também - este estágio sugou a maior parte do meu tempo, mas depois que a escola começa, mais progressos devem ser feitos .
Sean Allred

Fiquei muito feliz ao instalar um plug-in do navegador que me permite usar o Emacs para preencher o conteúdo da caixa de texto. Você vai fazer o Emacs entender a marcação do Wiki e exibir o texto formatado?
Kevin cline

@kevincline Não, a ideia é que apenas realize tarefas utilitárias: arquivamento de perguntas locais; edição avançada de código (alternando para o modo principal direito, semelhante a org); inserir <!-- language: blah>onde necessário (dependendo do modo em que a edição do código foi realizada); coisas assim. Veja o README no GitHub para mais informações, e se sentir mais bem-vindo para sugerir recursos. Quanto mais eu souber sobre isso antes, melhor ele poderá ser projetado. editar para não mencionar emacs atalhos de teclado;)
Sean Allred

Respostas:


1

O Emacs lisp não é otimizado para processamento de dados; você pode achar vantajoso usar um Common Lisp para o mecanismo e o Emacs apenas para apresentação.

Mesmo se você optar pelo Emacs Lisp, sugiro que você use dados estruturados ( eieio) em vez de listas e tabelas de hash em vez de listas.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.