[plexippus-xpath-devel] issues with large xml documents

Kevin Raison raison at chatsubo.net
Wed Feb 2 19:30:57 UTC 2011


Thanks, David.  This solves my problems!

-Kevin


On 02/02/2011 09:31 AM, David Lichteblau wrote:
> Hi,
>
> Quoting Kevin Raison (raison at chatsubo.net):
>> First, I want to say thanks for this xpath library;  it has kept me from
>> being forced to do my work in Java!
>>
>> Unfortunately, I have run into some issues when trying to handle very
>> large documents.  sbcl runs out of stack space when trying simple
>> queries (xpath:evaluate "c://ODM/Study" stp-doc) on a document like the
>> one here http://chatsubo.net/~raison/test.xml:
> [...]
>> If you follow the trace, it is XPATH::MAPPEND-PIPEs all the way down.
>> Any help is appreciated.  I have already tried upping my stack space
>> size by a factor of 5 (to 10 megs) with no luck.
>
> thanks for the report.  I have pushed the following fix to darcs:
>
> diff -rN -u old-plexippus-xpath/pipes.lisp new-plexippus-xpath/pipes.lisp
> --- old-plexippus-xpath/pipes.lisp	2011-02-02 18:27:07.000000000 +0100
> +++ new-plexippus-xpath/pipes.lisp	2011-02-02 18:27:07.000000000 +0100
> @@ -128,12 +128,19 @@
>               (make-pipe result (map-pipe-filtering fn tail filter-test))
>               (map-pipe-filtering fn tail filter-test)))))
>
> -(defun append-pipes (pipex pipey)
> -  "return a pipe that appends two pipes"
> +(defmacro append-pipes (pipex pipey)
> +  "return a pipe that appends two pipes.
> +
> +   The evaluation style of this macro has been chosen to be consistent
> +   with MAKE-PIPE: The first argument is evaluated eagerly; the second
> +   argument lazily."
> +  `(%append-pipes ,pipex #'(lambda () ,pipey)))
> +
> +(defun %append-pipes (pipex pipey-fun)
>     (if (pipe-empty-p pipex)
> -      pipey
> +      (funcall pipey-fun)
>         (make-pipe (pipe-head pipex)
> -                 (append-pipes (pipe-tail pipex) pipey))))
> +                 (append-pipes (pipe-tail pipex) (funcall pipey-fun)))))
>
>   (defun mappend-pipe (fn pipe)
>     "lazily map fn over pipe, appending results"
> diff -rN -u old-plexippus-xpath/xpath-test.lisp new-plexippus-xpath/xpath-test.lisp
> --- old-plexippus-xpath/xpath-test.lisp	2011-02-02 18:27:07.000000000 +0100
> +++ new-plexippus-xpath/xpath-test.lisp	2011-02-02 18:27:07.000000000 +0100
> @@ -627,3 +627,12 @@
>       (assert-equal
>        '(("a" (("id" "1"))) ("c" (("id" "6"))))
>        (all-nodes (evaluate "//c[position()=2]|//a[@id='1']" d)))))
> +
> +(deftest mappend-lazy
> +  (let* ((x nil)
> +         (pipe (mappend-pipe (lambda (x) (list (- x)))
> +                             (make-pipe 1 (progn (setf x t) '(2))))))
> +    (assert (not x))
> +    (assert (eql -1 (pipe-head pipe)))
> +    (assert (eql -2 (pipe-head (pipe-tail pipe))))
> +    (assert x)))
>
>
> d.
>




More information about the plexippus-xpath-devel mailing list