load-string evaluates the contents of the string, which brings in all of the compilation machinery, which produces bytecode, classes, etc. Classfiles have a 64K size limit in typical JVM implementations.
You want to use the read fn (which requires a PushbackReader), as all you're interested in is the data in the file -- you don't want or need code generation. Here's the fn I use for doing exactly this for resources in the classpath: (defn read-from-classpath "Loads the readable content from the given path within the current classpath using read." [rsrc-path] (with-open [r (java.io.PushbackReader. (java.io.InputStreamReader. (.getResourceAsStream java.lang.String rsrc-path) "UTF-8"))] (read r))) Cheers, - Chas On Aug 20, 2009, at 4:02 AM, Paul GT wrote: > > Dear list, > > I am writing some functions to serialize and deserialize clojure data > structures, > but somehow they do not work and I am stuck. > > The functions are as follows: > > (use 'clojure.contrib.duck-streams) > > (defn ser > "Returns the string serialization of object o." > [o] > (binding [*print-dup* true] (pr-str o))) > > (defn deser > "Returns the deserialization (excecutes) of string s." > [s] > (load-string s)) > > (defn ser-to-file > "Writes object o to file f." > [o f] > (spit f (ser o))) > > (defn deser-from-file > "Returns object stored in file f." > [f] > (deser (slurp f))) > > With the above definitions, I can run the code below and it executes > correctly: > > (ser-to-file [1 2 3] "my-file.txt") ;; Ok > (deser-from-file "my-file.txt") ;; Ok > > But if instead of a small vector like [1 2 3] > I use a big one (say ten thousand entries), > I receive an error message: > > (ser-to-file (into [] (range 10000)) "my-file.txt") ;; Ok > (deser-from-file "my-file.txt") ;; Error! > java.lang.ClassFormatError: Invalid method Code length 89867 in class > file user$eval__672 (NO_SOURCE_FILE:80) > > Actually, I first tried with a vector of one million entries, > but it consumed a lot of memory. > I started making it smaller and smaller and, on my machine, > when the vector has a length of 7200, it works. > But when it is 7300, the error comes up. > > I have tried it with clojure 1.0 and the latest 1.1 alpha in github, > both Vista and Ubuntu. > > Looks like the problem is in the deserialization, > because if I look at "my-file.txt" the vector is written correctly. > > I do not know what I am doing wrong. > If anybody could shed some light, I would be really grateful. > I am sorry if this seems like a simple issue or the solution is > obvious. > > Thank you very much for your patience. > > Paul. > > > --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---