0

大きな 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 でこれを行う明確な方法はありますか?

4

1 に答える 1

1

この問題は報告されており、現在、(将来のメジャー リリースに向けて) いくつかの機能強化に取り組んでおり、両方のオプションが少し簡単になるはずです。

今のところ、独自の Tokenizer をリーダーに提供する必要があります (そのため、Super CSV は独自のものではなく独自のものを使用します)。Super CSV のTokenizerのコピーを取り、変更を加えることをお勧めします。そうすれば、スーパー CSV を変更する必要がなくなり、時間を無駄にすることもありません。

于 2013-03-05T21:07:52.247 に答える