>>>>> "ES" == Emre Sevinc <[EMAIL PROTECTED]> writes:
ES> VST bana "social network analysis" baglaminda basladigi
ES> programdan ve Common Lisp ile mailman arsivlerini analiz
ES> etmekten bahsediyordu, son konustugumuzda string'leri
ES> birlestirmek icin vector-push-extend yerine baska bir sey
ES> kullanilmasinin daha performansli olabilecegine dair bir
ES> seyler düsünmüstük. Son durum merak ettim (neden bu kadar
ES> merakliyim ben? :))
Hemen aciklayayim.
Amac : Pipermail ile text formatinda arsivlenmis eposta listelerinin
islenebilir hale getirilmesini saglamak.
Ornek : http://cs.bilgi.edu.tr/pipermail/cs-lisp/ adresindeki tum
arsivlenmis mailleri bir assoc. list ya da sinif kullanarak teker
teker bir listeye atmak ve bunlari thread haline sokmak.
Kullanilan Araclar: Verilerin internetten alinmasini saglamak icin
thttp (trivial-http) ve stringler uzerinde regex ile filtreleme yapmak
icin cl-ppcre (regular exp. kutuphanesi)
Sorun: Cok yavas calisiyor.
Su anda anlatacak kadar dogru tespitler yapamamis olabilirim. Ama
yarin bu konu uzerinde akil acici tartismalar yapabiliriz.
En temelde thttp ile gelen streami once string'e cevirmek sonra da
satir satir regex calistirmak uzun is gibi geldi. O yuzden simdilik
streamden read-line ile okudugum her satir uzerinde regex
calistiriyorum. Yaklasik 5-6 tane. Bunun da isime cok yaradigi
soylenemez, ama faydasi oldu tabi. Ama temel sorunlarin scheme
derslerinden kalan "safe" fonksiyon kullanma saplantisi gibi
aliskanliklardan kaynaklandigini dusunuyorum. "Destructive"
fonksiyonlarin varligini da hesaba katmak gerekli sanirim :) Ve bunun
gibi optimizasyon teknikleri. Dinamik bellek yonetimi yapan dillerde
bu tarz "workaround"lari normal goruyorum acikcasi. Dedigim gibi biraz
daha incelemem gerekiyor.
Asagida kirli kodu gonderiyorum.
--vst
== Kod - Basla ================================================================
(defun is-from-line? (line)
(ppcre:scan "^From [^ ]+ at [^ ]+" line))
(defun is-date-line? (line)
(ppcre:scan "^Date:[ ]+[A-Za-z]{3}[ ]+[A-Za-z]{3}[ ]+[0-9]{1,2}[
]+[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}[ ]+[0-9]{4}" line))
(defun is-subject-line? (line)
(ppcre:scan "^Subject:[ ]+.*" line))
(defun is-msgid-line? (line)
(ppcre:scan "^Message-ID:[ ]+<[EMAIL PROTECTED]>" line))
(defun is-reply-to-line? (line)
(ppcre:scan "^In-Reply-To:[ ]+<[EMAIL PROTECTED]>" line))
(defun one-shot-mail-extractor (url-list)
(let ((maillist nil)
(mail nil))
(loop for rfile in url-list do
(let ((content-stream (caddr (thttp:http-get rfile))))
(do ((line (read-line content-stream nil nil)
(read-line content-stream nil nil)))
((null line) maillist)
(cond
((is-from-line? line) (progn (setf maillist
(cons mail maillist)) (setf mail nil) (setf mail (cons (cons ':FROM line)
mail))))
((is-date-line? line) (setf mail (cons (cons
':DATE line) mail)))
((is-subject-line? line) (setf mail (cons (cons
':SUBJECT line) mail)))
((is-msgid-line? line) (setf mail (cons (cons
':MESSAGE-ID line) mail)))
((is-reply-to-line? line) (setf mail (cons
(cons ':REPLY-TO-ID line) mail))))))) maillist))
== Kod - Bitir ================================================================
_______________________________________________
cs-lisp mailing list
[email protected]
http://church.cs.bilgi.edu.tr/lcg
http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp