[Date Prev][Date Next][Thread Prev][][Date Index][Thread Index]

Re: mew-shimbun.el (Very alpha ^^;)



いろいろなことに忙殺されててmew-shimbun にさえ手を出していない後藤です
今日もお仕事です。

>>>>> at Sat, 20 Oct 2001 07:52:13 +0900
>>>>> 土 == TSUCHIYA Masatoshi <tsuchiya@pine.kuee.kyoto-u.ac.jp> said,

土> ;; でもって、太り続ける -> alist では動作速度が不安 -> obarray で実装
土> ;; するのも、適切なハッシュサイズが計算できない -> binary search で実
土> ;; 装しようか、という考えだったのでした。真面目に設計するのでしたら、
土> ;; 登録済みの Message-ID の数から、ハッシュサイズを計算して obarray で
土> ;; 実装するのかなあ…。

obarray に関してて。ハッシュサイズの計算なんてしなくてもがんがん突っ込め
ば良いと思いますけど。手元のとあるcode では要素数2039 のvector に 70605 
突っ込んでます。emacs にしたって 1511 のvector に22761 は入ってます。
ある程度の目算をもってサイズを決めてしまえばいいと思いますよ。

obarray の利点は(symbol 名の)完全一致による検索ですので、Message-ID から
記事番号等を引くといった用途には最適のはずです。またMessage-IDによる
リンクを作る場合にも、シンボルのまま保持することでたどるのは速くなります。

ただ難点は保存/読み込みがしにくいこと。(print obarray) としても駄目で
mapatoms で回しながら書くか、一旦どこか別のlist に形式を変えてとっておいて
それをprin1 するか。また読む時はlist での形式からobarray で保持する形式への
(intern しながらの)変換が入ります。

list が膨大だと loop しながら、シンボル名文字列からintern すると時間がか
かるので、私のところでは以下のような邪悪なcode でobarray をすげ変えて一
気にread (intern)することで文字列からシンボルへの変換を省いてたりします。


(defun mue-dbf-read (buf db &optional close)
  (let ((cb (current-buffer))
	(bt (current-time))
	(ret nil)
	sym1 sym2 read-sym syms)
    ;; read sexp
    ;;(goto-char (point-min))
    (setq sym1 (intern-soft "read"))
    (setq sym2 (intern "read" db))
    (if (boundp sym1) (set sym2 (symbol-value sym1)))
    (if (fboundp sym1) (fset sym2 (symbol-function sym1)))
    (setq sym1 (intern "buf" db))
    (set  sym1 buf)
    (unwind-protect
	(condition-case nil
	    (setq syms (let ((obarray db)) (read buf)))
	  (error))
      (set-buffer cb)
      (if close
	  (mue-dbf-close buf)))
    (if mue-verbose
	(message "mue-dbf-read: %s sec" (mue-diff-time bt)))
    syms
    ))


--- Regards,
 Shun-ichi Goto  <gotoh@taiyo.co.jp>
   R&D Group, TAIYO Corp., Tokyo, JAPAN