大きな CSV ファイル (数百 MB) を処理するアプリケーションに取り組んでいます。最近、最初はアプリケーションのメモリ リークのように見える問題に直面しましたが、調査の結果、不適切な形式の CSV と CsvListReader が終わりのない行を解析しようとしていることが原因であることがわかりました。その結果、次の例外が発生しました。
at java.lang.OutOfMemoryError.<init>(<unknown string>)
at java.util.Arrays.copyOf(<unknown string>)
Local Variable: char[]#13624
at java.lang.AbstractStringBuilder.expandCapacity(<unknown string>)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(<unknown string>)
at java.lang.AbstractStringBuilder.append(<unknown string>)
at java.lang.StringBuilder.append(<unknown string>)
Local Variable: java.lang.StringBuilder#3
at org.supercsv.io.Tokenizer.readStringList(<unknown string>)
Local Variable: java.util.ArrayList#642
Local Variable: org.supercsv.io.Tokenizer#1
Local Variable: org.supercsv.io.PARSERSTATE#2
Local Variable: java.lang.String#14960
at org.supercsv.io.CsvListReader.read(<unknown string>)
ダンプの結果に基づいてヒープ ダンプと CSV ファイルを分析したところ、CSV 行の 1 つの列の 1 つに閉じ引用符が欠落していることに気付きました。その結果、明らかに、リーダーがファイルの内容を内部文字列バッファーに追加して行末を見つけようとしました。ヒープメモリはもうありませんでした。
とにかく、それが問題であり、それは不適切な形式の CSV が原因でした-重要な行を削除すると、問題はなくなりました。私が達成したいのは、読者に次のことを伝えることです。
- 解釈する必要があるすべてのコンテンツは、引用符が適切に閉じられていない場合でも、常に改行文字で終了します (複数行のサポートなし)
- または、CSV 行の特定の制限 (バイト単位) を提供するには
CsvListReader (私の場合は推奨) を使用して SuperCSV でこれを行う明確な方法はありますか?