Hi,

I've a head holding problem that I believe is a bug in clojure 1.3.  I
wrote the following function to split a a lazy seq of strings across
files of x size:

(defn split-file
  ([path strs size]
     (trampoline split-file path (seq strs) size 0))
  ([path strs size part]
     (with-open [f (clojure.java.io/writer (str path "." part))]
       (loop [written 0, ss strs]
         (when ss
           (if (>= written size)
             #(split-file path ss size (inc part))
             (let [s (first ss)]
               (.write f s)
               (recur (+ written (.length s)) (next ss)))))))))

If I call the 3 arg version of the function:
(split-file "foo" (repeat 100000000 "blah blah blah") 100000000)

I see memory usage increases as I'm writing each file with the usual
gc slow down, then memory usage goes back down again as I get to a new
split file.

Memory usage is fine if I call the 4 arg version (which only writes
one part of the split file):
(split-file "foo" (repeat 100000000 "blah blah blah") 100000000 0)

I can also avoid the head holding problem by removing trampoline and
recursively calling split-file directly, but then those recursive
calls use up stack and don't close files until all calls complete

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to