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/cache
son 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 question
yapı 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ı?
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;)