6

でEPPlusライブラリを使用してファイルasp.net + C#を作成してい.xlsxます。私のファイルには数百万のレコードが含まれている可能性があり、10万レコードExcelWorksheetごとに1つ作成しています。問題は、40Mbほとんど1.5Mレコードを含むxlsxがメインメモリの複数のGbsを取得し、その後OutOfMemoryException、質問が発生することです。質問は、次のとおりです。使用するメモリを減らすにはどうすればよいですかX Gb for 40M?:-| または、ExcelPackage徐々に保存してメモリの割り当てを解除します(複数回保存することはできず、その後パッケージ全体が破棄されるようです)。

解決策がない場合、誰かがEPPlusの代替案を紹介できますか(スタイリング、ワークシートなどのほとんどすべての機能を備えています)

4

2 に答える 2

5

この問題は、EPPlus の最新バージョン (4.0.x) で解決されているようです。


編集: EPPlus 4.0.4 で改善されたメモリ管理を示すページへの参照リンクを追加します。

https://epplus.codeplex.com/releases/view/118053#ReviewsAnchor 3.x バージョンと比較して 4.x バージョンで改善されたメモリ パフォーマンスに関するユーザーのレビュー

https://epplus.codeplex.com/wikipage?title=ロードマップ バージョン 4.0: 挿入、削除のパフォーマンスとメモリ消費 を改善するための新しい cellstore

このリンクは、膨大な数のセルのロードが最適化されるようにする方法を説明しています。

http://epplus.codeplex.com/wikipage?title=FAQ&referringTitle=Documentation 「ロードしたいデータがたくさんあります。最高のパフォーマンスを得るにはどうすればよいですか?」セクションを参照してください。

また、私は今日 EPPlus 4.0.4 を個人的にテストしました。5 つの数値行と 1 つの DateTime 行の 150 万レコードを一度に書き出すことで、Windows タスク マネージャーによって報告されたピーク メモリ ワーキング セットはわずか 711 MB でした。Windows タスク マネージャーで表示される非ページ プールは、わずか 75K 程度でした。もちろん、これらの数値がメモリ フットプリントの影響を完全に捉えているかどうかはわかりませんが、これらは目安です。出力された Excel ファイルは約 59 MB でした (元の投稿で言及されたサンプル データよりも多くの列があった可能性があります)。

注: 一度に 7 列の 450 万件のレコードを書き込もうとしたときに、"OutOfMemoryException" が発生しました。

私のテストは十分に厳密ですか?多分そうではありません...私にとってはうまくいきます。


ただし、以前のバージョンでの大量のメモリ要件を克服するために考えられる 1 つの回避策は、100K レコードごとに xlsx ファイルを分割して保存することです。保存後、次の 100K レコードに対して新しいファイル (適切なファイル名カウンターの増分を使用) の使用を開始します。

操作の最後には、たとえば合計 100 万レコードの 100K レコードのファイルが 10 個あることになります。

ちょっとしたハックのように思えるかもしれませんが、他のライブラリ (無料または商用) を使用するようにコード ベースを書き直すよりはましかもしれません。

于 2015-06-30T08:42:25.600 に答える