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)