Jestem na wczesnym etapie pisania głównego trybu Emacsa dla sieci Stack Exchange ; jeśli regularnie używasz Emacsa, to w końcu przyniesie ci korzyść.
Aby zminimalizować liczbę wywołań do interfejsu API Stack Exchange (ograniczenie do 10000 na IP dziennie) i po prostu być ogólnie odpowiedzialnym obywatelem, chcę buforować informacje otrzymywane z sieci i przechowywać je w pamięci, czekając na być ponownie dostępnym. Naprawdę utknąłem w strukturze danych do przechowywania tych informacji.
Oczywiście będzie to lista. Jednak, podobnie jak w przypadku każdej struktury danych, wybór musi zostać określony na podstawie tego, jakie dane są przechowywane i w jaki sposób będą one dostępne. Co, chciałbym móc przechowywać wszystkie te informacje w jednym symbolu, takim jak stack-api/cache
. Więc bez zbędnych ceregieli stack-api/cache
jest lista stożków wpisanych przez ostatnią aktualizację:
`(<csite> <csite> <csite>)
gdzie <csite>
by byl
(1362501715 . <site>)
W tym momencie wszystko, co zrobiliśmy, to zdefiniowanie prostej listy skojarzeń . Oczywiście musimy wejść głębiej .
Każda <site>
jest listą parametru API (unikatowego), po której następuje lista pytań:
`("codereview" <cquestion> <cquestion> <cquestion>)
<cquestion>
Zgadłeś, że każda z nich jest wadą pytań związanych z ich ostatnią aktualizacją:
`(1362501715 <question>) (1362501720 . <question>)
<question>
Jest to wady w question
konstrukcji oraz listę odpowiedzi (znowu consed z ich ostatnim czasie aktualizacji):
`(<question-structure> <canswer> <canswer> <canswer>
i `
`(1362501715 . <answer-structure>)
Ta struktura danych jest prawdopodobnie najdokładniej opisana jako drzewo, ale nie wiem, czy istnieje lepszy sposób, aby to zrobić, biorąc pod uwagę język Emacs Lisp (który nie różni się tak bardzo od Lisp, które znasz i kochasz w ogóle ) . Wyraźne szyszki są prawdopodobnie niepotrzebne, ale pomaga to mojemu mózgowi lepiej się owijać. Jestem pewien <csite>
, że na przykład po prostu się zmieni
(<epoch-time> <api-param> <cquestion> <cquestion> ...)
Obawy:
- Czy przechowywanie danych w potencjalnie ogromnej strukturze takiej jak ta ma jakiekolwiek kompromisy w wydajności systemu? Chciałbym uniknąć przechowywania obcych danych, ale zrobiłem, co mogłem i nie sądzę, że zestaw danych jest tak duży (przede wszystkim do normalnego użytku), ponieważ jest to tylko tekst czytelny dla człowieka w rozsądnej proporcji. (Planuję wyciszać stare dane, wykorzystując czasy na początku listy; każdy dziedziczy czas ostatniej aktualizacji od swoich potomków i tak dalej w dół drzewa. W jakim stopniu to miejsce powinno mieć miejsce: nie jestem pewnie.)
- Czy przechowywanie takich danych ma jakiekolwiek kompromisy w wydajności w stosunku do tego, co musi z nich korzystać? To znaczy, czy operacje ustawiania i pobierania będą miały wpływ na rozmiar listy?
Czy masz jakieś sugestie, jak może wyglądać lepsza struktura?
źródło
org
); wstawianie w<!-- language: blah>
razie potrzeby (w zależności od trybu, w którym dokonano edycji kodu); takie rzeczy. Zobacz README na GitHub, aby uzyskać więcej informacji i poczuć najwięcej powitanie sugerować możliwości. Im więcej wiem o tym wcześniej, tym lepiej można go zaprojektować. edytuj, nie wspominając o skrótach klawiszowych emacsa;)Odpowiedzi:
Emacs lisp nie jest zoptymalizowany do przetwarzania danych; korzystne może być użycie Common Lisp dla silnika i Emacsa tylko do prezentacji.
Nawet jeśli zdecydujesz się pozostać przy Emacs Lisp, sugeruję, abyś używał danych strukturalnych (
eieio
) zamiast list i tabel skrótów zamiast list.źródło