I am getting an OutOfMemoryError while writing a very large map to a file.
It appears that it is trying to grow the size of the buffer at some point
and trying to make a copy of the data already in the buffer, but I could be
misinterpreting the stack trace. I have the JVM heap set to 24gb right now
and can't really go any higher.

I'm using the Clojure library "abracad" to do the writing. It's using a
DataFileWriter and ClojureDatumWriter which is a subclass of
GenericDatumWriter. I have a Clojure map that I am simply passing to the
append method of the DataFileWriter. Does anyone have a suggestion for
making the write not try to copy the data in memory as it's writing?

Here is the relevant piece of the stack trace:

java.lang.OutOfMemoryError: Requested array size exceeds VM limit
        at java.util.Arrays.copyOf(Arrays.java:3236)
        at
java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:113)
        at
java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
        at
java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:140)
        at
org.apache.avro.io.BufferedBinaryEncoder$OutputStreamSink.innerWrite(BufferedBinaryEncoder.java:216)
        at
org.apache.avro.io.BufferedBinaryEncoder.flushBuffer(BufferedBinaryEncoder.java:93)
        at
org.apache.avro.io.BufferedBinaryEncoder.ensureBounds(BufferedBinaryEncoder.java:108)
        at
org.apache.avro.io.BufferedBinaryEncoder.writeLong(BufferedBinaryEncoder.java:129)
        at abracad.avro.ClojureDatumWriter.write(ClojureDatumWriter.java:47)
        at
org.apache.avro.generic.GenericDatumWriter.writeMap(GenericDatumWriter.java:180)
        at
org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:69)
        at abracad.avro.ClojureDatumWriter.write(ClojureDatumWriter.java:51)
        at
org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:58)
        at
org.apache.avro.file.DataFileWriter.append(DataFileWriter.java:290)
        at
com.idexx.medical_notes.read_notes$map__GT_avro_file.invoke(read_notes.clj:46)
        at
com.idexx.medical_notes.read_notes$listener$fn__5159$fn__5161.invoke(read_notes.clj:244)
        at
com.idexx.medical_notes.read_notes.proxy$akka.actor.UntypedActor$ff19274a.onReceive(Unknown
Source)
        at
akka.actor.UntypedActor$$anonfun$receive$1.applyOrElse(UntypedActor.scala:167)
        at akka.actor.Actor$class.aroundReceive(Actor.scala:467)
        at akka.actor.UntypedActor.aroundReceive(UntypedActor.scala:97)
        at
com.idexx.medical_notes.read_notes.proxy$akka.actor.UntypedActor$ff19274a.aroundReceive(Unknown
Source)
        at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516)
        at akka.actor.ActorCell.invoke(ActorCell.scala:487)
        at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:238)
        at akka.dispatch.Mailbox.run(Mailbox.scala:220)
        at
akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:397)
        at
scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
        at
scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
        at
scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
        at
scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
        at abracad.avro.ClojureDatumWriter.write(ClojureDatumWriter.java:47)
        at
org.apache.avro.generic.GenericDatumWriter.writeMap(GenericDatumWriter.java:180)
        at
org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:69)
        at abracad.avro.ClojureDatumWriter.write(ClojureDatumWriter.java:51)
        at
org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:58)
        at
org.apache.avro.file.DataFileWriter.append(DataFileWriter.java:290)

Reply via email to