Kendi API'mız için En Uygun Veri Yapısı


10

Stack Exchange ağı için bir Emacs büyük mod yazma erken aşamalarındayım ; Emacs'ı düzenli olarak kullanırsanız, bu sonunda size fayda sağlayacaktır.

Stack Exchange'in API'sine yapılan çağrı sayısını ( günde IP başına 10000 olarak sınırlandırılır) en aza indirmek ve yalnızca genel olarak sorumlu bir vatandaş olmak için, ağdan aldığım bilgileri önbelleğe almak ve bellekte saklamak, tekrar erişilebilir. Bu bilgiyi hangi veri yapısında saklayacağımı gerçekten şaşırdım.

Açıkçası, bu bir liste olacak. Ancak, herhangi bir veri yapısında olduğu gibi, seçim hangi verinin saklandığı ve neye nasıl erişileceğiyle belirlenmelidir. Ne, tüm bu bilgileri gibi tek bir sembolde saklamak istiyorum stack-api/cache. Yani, daha fazla uzatmadan, stack-api/cacheson güncelleme ile anahtarlanan bir listedir:

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

nerede <csite>olurdu

(1362501715 . <site>)

Bu noktada, tek yaptığımız basit bir ilişkilendirme listesi tanımlamak . Tabii ki daha derine inmeliyiz .

Her <site>biri API parametresinin (benzersiz) bir listesidir ve ardından bir liste sorusu gelir:

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

Her <cquestion>biri, tahmin ettiniz, son güncelleme süreleriyle birlikte bir soru eksisi:

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

<question>Bir bir eksileri olan questionyapı ve (yine birlikte consed yanıtların listesi kendi son güncelleme zamanı):

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

ve `

`(1362501715 . <answer-structure>)

Emacs Lisp (bütün Lisp pek farklı değildir bildiğiniz ve sevdiğiniz Bu veri yapısı olasılıkla en doğru şekilde bir ağaç olarak açıklanmıştır, ama dilini dikkate Bunu yapmak için daha iyi bir yol varsa bilmiyorum hiç ) . Açık koniler muhtemelen gereksizdir, ancak beynimin daha iyi sarılmasına yardımcı olur. Eminim a <csite>, örneğin,

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

Endişeler:

  • Bu gibi potansiyel olarak büyük bir yapıda veri depolamanın sistem için performans ödünleşimi var mı? Ben yabancı veri depolamaktan kaçınmak istiyorum, ama elimden geleni yaptım ve veri kümesinin ilk etapta (normal kullanım için) bu kadar büyük olduğunu düşünmüyorum çünkü hepsi sadece insan tarafından okunabilir metin makul oranda. (Listenin başındaki zamanları kullanarak eski verileri kaldırmayı planlıyorum; her biri son güncelleme zamanını çocuklarından devralır ve ağaçtan aşağıya iner. Bu itlağın ne ölçüde gerçekleşmesi gerektiğini: Elbette.)
  • Bunun gibi verilerin depolanması, kullanması gereken herhangi bir performans değiş tokuşu var mı? Yani, ayarlama ve alma işlemleri listenin boyutundan muzdarip olacak mı?

Daha iyi bir yapının nasıl görünebileceğine dair başka önerileriniz var mı?


Bunu + 1 yapıyorum çünkü bu modu gerçekten istiyorum
Daniel Gratzer

@jozefg Gerçekten de istiyorum - bu staj zamanımın çoğunu emdi, ama okul başladığında biraz daha ilerleme kaydedilmelidir .
Sean Allred

Metin kutusu içeriğini doldurmak için Emacs kullanmamı sağlayan bir tarayıcı eklentisi yüklemekten oldukça mutlu oldum. Emacs'ın Wiki işaretlemesini anlamasını ve biçimlendirilmiş metni görüntülemesini sağlayacak mısınız?
kevin cline

@kevincline Hayır, fikir şu ki faydacı görevler yapacak: yerel soru arşivi; gelişmiş kod düzenleme (doğru ana moda geçerek, buna benzer org); <!-- language: blah>gerektiğinde ekleme (kod düzenlemenin yapıldığı moda bağlı olarak); onun gibi şeyler. Daha fazla bilgi için GitHub'daki README'ye bakın ve özellik önermek için en iyisi olun. Elden önce bunu ne kadar çok bilirsem, o kadar iyi tasarlanabilir. düzenlemek not to mention emacs keybindings;)
Sean Allred

Yanıtlar:


1

Emacs lisp veri işleme için optimize edilmemiştir; motor için Ortak Lisp ve yalnızca sunum için Emacs kullanmanın avantajlı olduğunu görebilirsiniz.

Emacs Lisp ile kalmaya karar verseniz bile eieio, listeler yerine yapılandırılmış veriler ( ) ve alists yerine karma tablolar kullanmanızı öneririm .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.