Christian Feuersaenger created CSV-311:
------------------------------------------
Summary: OutOfMemory for very long rows despite using column value
of type Reader
Key: CSV-311
URL: https://issues.apache.org/jira/browse/CSV-311
Project: Commons CSV
Issue Type: Bug
Components: Printer
Affects Versions: 1.10.0
Reporter: Christian Feuersaenger
Our application makes use of commons-csv (great software, thanks!) .
Recently, we got a support request because someone had unexpectedly large
column values in one CSV row - so large that our explicitly chosen limits on
the java heap did not suffice.
We analyzed the heap dump and found that a huge row was the culprit; the stack
trace in question is
{noformat}
Caused by -> java.lang.OutOfMemoryError: Java heap space
Arrays.copyOf:3537
AbstractStringBuilder.ensureCapacityInternal:228
AbstractStringBuilder.append:802
StringBuilder.append:246
CSVFormat.printWithQuotes:2127
CSVFormat.print:1834
CSVFormat.print:1783
CSVPrinter.print:166
CSVPrinter.printRecord:259
CSVPrinter.printRecord:278 {noformat}
Note that we provide column values of type java.io.Reader as accepted by
org.apache.commons.csv.CSVFormat.print(Object, Appendable, boolean) .
The problem is that CSVFormat.print really supports java.io.Reader, but despite
just piping characters (possibly escaped/quoted) into the appendable output
stream, it reads everything into a StringBuilder which is then copied to the
appendable output stream.
Is there a way to improve this situation? We are working in a setup in which
java heap cannot be spend arbitrarily and we would rather have an approach
which works out of the box.
Thanks for looking into it!
--
This message was sent by Atlassian Jira
(v8.20.10#820010)