- PR -

ある一定以上読み込めなくなります

1
投稿者投稿内容
ぶぅぶぅ
常連さん
会議室デビュー日: 2005/10/19
投稿数: 20
投稿日時: 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 ]
Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2005-12-18 00:40
読めない時は,何か例外がでてるんですか?
出てるなら,スタックトレースを出せば原因が書かれてるかもしれません。
単にメモリが足りてないだけっていう気もします。
ぶぅぶぅ
常連さん
会議室デビュー日: 2005/10/19
投稿数: 20
投稿日時: 2005-12-18 00:58
エラーは
java.lang.OutOfMemoryError
でした。やっぱりメモリ不足ということでしょうか。。

これを回避する方法とかはありますか?
ひでっぷ
会議室デビュー日: 2003/12/09
投稿数: 17
投稿日時: 2005-12-18 01:13
Javaの使用メモリ割当量をオーバーしていますね。
最大メモリ割当量はデフォルトで64MBなので
-Xmxオプションで最大ヒープサイズを増やしましょう。

java -Xmx256m

ってな感じです。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-12-18 02:22
「構成および実行」>「引数」(タブ)>「VM引数」と辿って、
javaコマンドの引数を入力すればOKです。

しかし、java.lang.OutOfMemoryErrorが発生する自体が問題であって、
メモリ量を増やして解決というのは、根本的な解決ではありませんね。
コードの中でimg[]という配列に画像を格納していますが、
何の為に使用しているのでしょうか。
この部分で参照が残っている為、メモリが解放されていないのが原因かと思います。

特にメディア系のファイルは容量も大きいため、
メモリを圧迫しないような工夫が必要ですね。
・必要な分だけ読み込む
・不要な分は捨てる
・微妙な分は物理ディスクに一時保存
などの工夫が必要だと思います。
ぶぅぶぅ
常連さん
会議室デビュー日: 2005/10/19
投稿数: 20
投稿日時: 2005-12-18 02:40
かつのりさんの言うとおり、別に配列にする必要はなかったみたいですね^^;
でも、みなさんの助言で助かりました!ありがとうございました!
1

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