リストの添付アップロードは倍のメモリを消費する
SharePointはサーバーの全体管理とweb.configの設定で、アップロードできるファイルの最大条件容量を指定することが出来ます。しかし、比較的大きな値(200MB等)を設定した場合、ライブラリには(時間はかかりますが)アップロードに成功するものの、リストの添付ファイルの場合、設定したしきい値よりかなり少い値(例えば数十MB)でも失敗するケースが頻発します。
この原因は長らく謎でしたが、先日、Microsoftからおそらくこれだろう、という技術情報を頂くことができましたのでご紹介します。
結論から書いてしまうと、これはSharePointの「仕様」のようです。
ファイルがアップロードされると、SharePointはフロントのメモリ上に、一旦そのファイルを展開します。この時、ただメモリにファイルの容量分の「空き」があるだけでは駄目で、「連続したメモリ領域」が必要になります。領域が確保できない場合、OutOfMemoryException が発生しアップロードは失敗します。
[フィールドの種類 “添付ファイル” のコントロールから “添付ファイル” 列の値を取得できませんでした。詳細はログを参照してください。例外メッセージ: 種類 ‘System.OutOfMemoryException’ の例外がスローされました。]
リストアイテムへの添付の場合、もうひとつ、余計な(?)処理が行われます。ファイルの展開が終了した後、SharePointは同じメモリ上で、更にそのファイルのコピー(のような処理)を行うのです。この領域も「連続」している必要があり、従って、50MBのファイルを添付するには、50MB+50MBで100MBの連続領域が必要です。
この仕様から、必然的にメモリ上限の厳しい32bit環境において、この問題が顕著です。Microsoftが推奨する回避策は64bit化ですが…32bit環境からの移行はそう簡単ではありませんし、そもそも64bit環境でもメモリが無尽蔵にある訳でもありません。
根本的には、環境のチューニングと、大容量ファイルのアップロードにSharePointは利用しない、という運用で回避するしかなさそうです。
login