James:

This sounds to me likely to be known and expected behavior of xargs.  Any
OS has maximum limitations on either number and/or total size of command
line arguments, and xargs is probably invoking multiple JVMs.

Here is a portion of the man page for xargs on my Mac:

Any arguments specified on the command line are given to utility upon

     each invocation, followed by some number of the arguments read from the

     standard input of xargs.  The utility is repeatedly executed until
stan-

     dard input is exhausted.

Andy


On Thu, Oct 15, 2015 at 10:10 PM, James Paton <[email protected]> wrote:

> I ran into an apparent bug today when trying to stress test a program I
> wrote. The program was just supposed to tell you both the minimum and
> maximum integers supplied in the command line arguments. I tried using
> xargs to provide thousands of numbers when I encountered this issue.
> However, I can repro it as follows, using Leiningen 2.5.1 and Clojure
> 1.6.0. As you can see, when I do lein run, it prints an exception about
> "Method code too large", but then prints out Hello World. And when I use
> the uberjar, it just prints the output twice.
>
> jpaton2@jpaton2-mba ~/Projects> lein -v
> Leiningen 2.5.1 on Java 1.8.0_60 Java HotSpot(TM) 64-Bit Server VM
> jpaton2@jpaton2-mba ~/Projects> lein new app test-args
> Generating a project called test-args based on the 'app' template.
> jpaton2@jpaton2-mba ~/Projects> cd test-args/
> jpaton2@jpaton2-mba ~/P/test-args> lein run
> Hello, World!
> jpaton2@jpaton2-mba ~/P/test-args> wc -l ../numbers
>     7514 ../numbers
> jpaton2@jpaton2-mba ~/P/test-args> xargs lein run -- < ../numbers
> Exception in thread "main" java.lang.RuntimeException: Method code too
> large!,
> compiling:(/private/var/folders/wd/shmj7jgd7sqbk9wyh8dp0lz1jq62k4/T/form-init6518370413228051607.clj:1:165)
> at clojure.lang.Compiler.analyzeSeq(Compiler.java:6651)
> at clojure.lang.Compiler.analyze(Compiler.java:6445)
> at clojure.lang.Compiler.eval(Compiler.java:6700)
> at clojure.lang.Compiler.eval(Compiler.java:6693)
> at clojure.lang.Compiler.load(Compiler.java:7130)
> at clojure.lang.Compiler.loadFile(Compiler.java:7086)
> at clojure.main$load_script.invoke(main.clj:274)
> at clojure.main$init_opt.invoke(main.clj:279)
> at clojure.main$initialize.invoke(main.clj:307)
> at clojure.main$null_opt.invoke(main.clj:342)
> at clojure.main$main.doInvoke(main.clj:420)
> at clojure.lang.RestFn.invoke(RestFn.java:421)
> at clojure.lang.Var.invoke(Var.java:383)
> at clojure.lang.AFn.applyToHelper(AFn.java:156)
> at clojure.lang.Var.applyTo(Var.java:700)
> at clojure.main.main(main.java:37)
> Caused by: java.lang.RuntimeException: Method code too large!
> at clojure.asm.MethodWriter.getSize(MethodWriter.java:1872)
> at clojure.asm.ClassWriter.toByteArray(ClassWriter.java:775)
> at clojure.lang.Compiler$ObjExpr.compile(Compiler.java:4450)
> at clojure.lang.Compiler$FnExpr.parse(Compiler.java:3904)
> at clojure.lang.Compiler.analyzeSeq(Compiler.java:6642)
> ... 15 more
> Hello, World!
> jpaton2@jpaton2-mba ~/P/test-args> lein uberjar
> Compiling test-args.core
> Created
> /Users/jpaton2/Projects/test-args/target/uberjar+uberjar/test-args-0.1.0-SNAPSHOT.jar
> Created
> /Users/jpaton2/Projects/test-args/target/uberjar/test-args-0.1.0-SNAPSHOT-standalone.jar
> jpaton2@jpaton2-mba ~/P/test-args> xargs java -jar
> target/uberjar/test-args-0.1.0-SNAPSHOT-standalone.jar < ../numbers
> Hello, World!
> Hello, World!
>
> I found, through trial and error, that it appears to be sharding the
> arguments in chunks of 5000, then calling -main once for each chunk. I can
> verify this by using a file with the first 7000 numbers and the following
> program:
>
> (ns test-args.core
>   (:gen-class))
>
> (defn -main
>   [& args]
>   (println (apply max (map #(Integer/parseInt %) args))))
>
> Using that for my core.clj file, I get the following:
>
> jpaton2@jpaton2-mba ~/P/test-args> lein uberjar
> Compiling test-args.core
> Created
> /Users/jpaton2/Projects/test-args/target/uberjar+uberjar/test-args-0.1.0-SNAPSHOT.jar
> Created
> /Users/jpaton2/Projects/test-args/target/uberjar/test-args-0.1.0-SNAPSHOT-standalone.jar
> jpaton2@jpaton2-mba ~/P/test-args> xargs java -jar
> target/uberjar/test-args-0.1.0-SNAPSHOT-standalone.jar < ../numbers
> 4999
> 6999
>
> Curious if this is a known problem and whether anyone can offer insight.
>
> --
> 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
> ---
> You received this message because you are subscribed to the Google Groups
> "Clojure" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to