7

大量のデータ (115.000 行 x 30 列) を Excel OpenXML 形式 (xlsx) でエクスポートしようとしています。DocumentFormat.OpenXML、ClosedXML、NPOI などのライブラリを使用しています。

このたびに OutOfMemoryException がスローされます。これは、メモリ内のシートの表現によってメモリが指数関数的に増加するためです。

また、ドキュメント ファイルを 1000 行ごとに閉じる (およびメモリを解放する) と、次の読み込みでメモリが増加します。

多くのメモリを占有せずに xlsx でデータをエクスポートするより効率的な方法はありますか?

4

3 に答える 3

1

Excel は、コンピューターに十分なメモリがある限り、かなり大きなファイルを開くことができます。それがほとんどの場合、制限要因です...

そこにあるライブラリの 99% は、大きなデータ セットを処理するように構築されていないため、それらに大量のデータを投げようとすると、メモリ不足エラーが発生します。

私が作成したスパウトのように、この問題を解決するために作成されたものもいくつかあります。秘訣は、データをストリーミングし、メモリに物を保存しないようにすることです。どの言語を使用しているかはわかりませんが (PHP ではないようです)、その言語用の類似のライブラリーがあるかもしれません。そうでない場合でも、Spout (オープンソース) を見て、自分の言語に変換できます。

于 2015-09-21T17:08:36.360 に答える
-1

データベースを使用する必要があるスプレッドシートを使用しているようです。それには限界があり、これは簡単にそのうちの 1 つである可能性があります。既存のソリューションに固執する必要がある場合にのみ、さらにお読みください。ただし、お勧めしません。もう 1 つ質問があります。Excel でこのような大きなファイルを保存できない場合、そのようなファイルを開くことができるでしょうか。

したがって、データベース プラットフォームに切り替えることができず、上記の標準ライブラリが内部的にそのような量のデータを処理できない場合は、大規模な XLSX を作成するときに自分で作業している可能性があります。たとえば、このアプローチを意味します:

  1. データをバッチ (1,000 または 10,000 または任意のもの) でエクスポートして、バッチごとにファイルを分けます
  2. 個別のファイルを1つに結合するツール((これは vba に最も近い、しっかりしたXMLライブラリを持っているものなら何でも)を作成します。それには以下が含まれます:

    1. XLSX からの XML の抽出 (通常はfile.xlsx\xl\worksheets\sheet1.xmlおよびfile.xlsx\xl\worksheets\sharedStrings.xml)
    2. これらのパーツを XML 操作ライブラリで結合します (複雑なスプレッドシート オブジェクトを使用しなくなったため、OutOfMemoryException でクラッシュすることはありません)。
    3. 結果ファイルをメイン XLSX に再パックします (最初のバッチ出力ファイルをメイン XLSX として使用できます)。

結果を達成するための可能な方法を示しましたが、それは避けます。Excel は、大量のデータを保存するためのプラットフォームではありませんでした。上記のタスクと比較して、この領域のツール/プロセスを変更する時期であることを経営陣に納得させるのは簡単かもしれません.

于 2015-09-21T10:38:18.400 に答える