- PR -

ファイルアップロードでOutOfMemoryError

1
投稿者投稿内容
未記入
ベテラン
会議室デビュー日: 2005/04/16
投稿数: 51
投稿日時: 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
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-12-29 13:09
HttpServletRequest から読み込んでくる内容をヒープにため込まないで逐一ファイルに書き込むようにすればよいのではないでしょうか。
ただ、世に出回っている著明な製品がファイルサイズに応じたヒープ容量を必要とする実装になっているとは考えにくいですが・・・。
未記入
ベテラン
会議室デビュー日: 2005/04/16
投稿数: 51
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)