- - PR -
ファイルアップロードでOutOfMemoryError
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2005-12-29 09:14
Jetspeed(正確にはTurbine)のファイルアップロード機能を利用しています。
アップロードしたいファイルには100MBを超えるものがあり ファイルアップロードのデフォルトの設定では 1Mより大きいファイルを扱えなかったので TurbineResources.propertiesで services.UploadService.size.maxを新たに指定することで 1MBより大きいものもアップロードできるようになりました。 ところが今度は、 少なくとも11MBのファイルはアップロードできましたが 27Mのファイルは java.lang.OutOfMemoryError が発生してアップロードできませんでした。 もともと環境変数CATALINA_OPTSによって ヒープサイズを拡大しています。 (1G程度) これによってヒープサイズを拡大しないと異常終了していた処理も 正常に終了させることができていました。 しかしファイルアップロードについては この設定がしてあっても OutOfMemoryErrorが発生してしまうのです。 Mac OS なので利用しているWebブラウザはsafariです。 safariの起動時にそれが利用するjavaに対して ヒープサイズ拡大の指定ができないだろうかと考えましたが それは見当違いでしょうか? それを試したいのですが、 どうすればそれが出来るのかその方法がまだわからないのです。 漠とした質問で恐縮ですが よろしければこれについて何かアドバイスをお願い申し上げます。 ■環境■ OS : Mac OS X Server 10.4 AP Server : Tomcat 4.1.29 Framework : jetspeed-japan-1.5_ja_2 |
|
投稿日時: 2005-12-29 13:09
HttpServletRequest から読み込んでくる内容をヒープにため込まないで逐一ファイルに書き込むようにすればよいのではないでしょうか。
ただ、世に出回っている著明な製品がファイルサイズに応じたヒープ容量を必要とする実装になっているとは考えにくいですが・・・。 |
|
投稿日時: 2005-12-29 21:22
Turbineではなくcommons-fileUploadを少し利用してみることにしました。
JSPでファイルをSubmitし RunDataを引数として受け取るサーブレットで次のようにコーディングしたとき、 HttpServletRequest request = RunData.getRequest(); DiskFileUpload upload = new DiskFileUpload(); upload.setSizeMax(150000000); List list = upload.parseRequest(request); Iterator it = list.iterator(); FileItem item = (FileItem)it.next(); ・・・以下続く listの内容をログファイルに吐かせてみると [] でした。 どうも取得できていないようです。 そのため、引用した最後の行の itemが取得できず java.util.NoSuchElementException が発生しています。 もともとTurbineを使用していたときに 全く同じメソッド内で FileItem file = RunData.getParameters().getFileItem("file"); file.write("/Inputs/test.txt"); のようなコーディングをしていました。 ファイルサイズが巨大でなければこのコードで問題なくファイルはUploadできていました。 そのためRunDataは正しく受け取れていると思うのですが・・・・・・。 上記のコードでどこに問題があるか よろしければ教えてください。 宜しくお願い申し上げます。 |
1