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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---