- - PR -
ある一定以上読み込めなくなります
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2005-12-17 23:25
あるファイル内に画像が7万枚くらいあって、全てに処理を施すのが大変なので任意に1000枚くらい選ぼうと考えています。
とりあえず、ファイル内にあるJpeg画像を読み込んで別名にて保存しようとしています。 ところが、ImageIOを使っても、JPEGImageDecoderを使っても240枚くらいしか読み込むことができません。それ以上の画像は読み込むことができないんでしょうか? どなたか、分かるかたがいらしたら返答よろしくお願いします。 私が書いたコードは以下の通りです。 public class getJPEG { private static int a = 0; public static void main(String[] args) { new getJPEG(); } getJPEG(){ Image[] img = new Image[800]; File targetDir1 = null; targetDir1 = new File("c:/Jpeg/"); if (targetDir1.exists() && targetDir1.isDirectory()) { File[] fileList1 = targetDir1.listFiles(); // System.out.println(fileList1.length); for (int i = 0; i < fileList1.length; i+=100) { try{ try{ // File ins = fileList1[i]; // FileInputStream is = new FileInputStream(ins); // JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(is); // img[a] = decoder.decodeAsBufferedImage(); img[a]=ImageIO.read(fileList1[i]); System.out.println(i); } catch (IOException e1) { e1.printStackTrace(); } BufferedImage f = new BufferedImage(320,240,BufferedImage.TYPE_INT_RGB); Graphics2D gra = f.createGraphics(); gra.drawImage(img[a],0,0,320,240,null); try { FileOutputStream out = new FileOutputStream("c:/Data/img"+ a +".jpg"); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(f); out.close(); // boolean result = ImageIO.write(f, "jpg", new File("c:/Data/img"+ a +".jpg")); } catch (Exception e1) { e1.printStackTrace(); } // System.out.println(a); a++; } catch (Throwable e2) { break; } } } } } [ メッセージ編集済み 編集者: ぶぅぶぅ 編集日時 2005-12-17 23:28 ] |
|
投稿日時: 2005-12-18 00:40
読めない時は,何か例外がでてるんですか?
出てるなら,スタックトレースを出せば原因が書かれてるかもしれません。 単にメモリが足りてないだけっていう気もします。 |
|
投稿日時: 2005-12-18 00:58
エラーは
java.lang.OutOfMemoryError でした。やっぱりメモリ不足ということでしょうか。。 これを回避する方法とかはありますか? |
|
投稿日時: 2005-12-18 01:13
Javaの使用メモリ割当量をオーバーしていますね。
最大メモリ割当量はデフォルトで64MBなので -Xmxオプションで最大ヒープサイズを増やしましょう。 java -Xmx256m ってな感じです。 |
|
投稿日時: 2005-12-18 02:22
「構成および実行」>「引数」(タブ)>「VM引数」と辿って、
javaコマンドの引数を入力すればOKです。 しかし、java.lang.OutOfMemoryErrorが発生する自体が問題であって、 メモリ量を増やして解決というのは、根本的な解決ではありませんね。 コードの中でimg[]という配列に画像を格納していますが、 何の為に使用しているのでしょうか。 この部分で参照が残っている為、メモリが解放されていないのが原因かと思います。 特にメディア系のファイルは容量も大きいため、 メモリを圧迫しないような工夫が必要ですね。 ・必要な分だけ読み込む ・不要な分は捨てる ・微妙な分は物理ディスクに一時保存 などの工夫が必要だと思います。 |
|
投稿日時: 2005-12-18 02:40
かつのりさんの言うとおり、別に配列にする必要はなかったみたいですね^^;
でも、みなさんの助言で助かりました!ありがとうございました! |
1