2
List<Picture> pictures = Picture.findAll(); //Around 2GB of data (uses JPA/play framework)

for (Picture picture : pictures) {
  byte[] b = picture.image.data; //Image raw data is stored in a different table than Picture table
  System.out.println(picture.file_name + " " + b.length);
}

上記のコードjava.lang.OutOfMemoryErrorは、DB内のファイル参照ではなくデータベースに画像が保存されているため、実行時にを引き起こします。

とにかく、オブジェクトの処理が終了したら、メモリを「フラッシュ」できますか?私は試しましたpicture.em().flush()が、Iterator.remove(), System.gc()どれもうまくいきませんでした。助けてください。

4

2 に答える 2

2

私は解決策を見つけたようです。すべての写真の後、エンティティ マネージャーをクリアします。

List<Picture> pictures = Picture.findAll();
for(int i=0;i<pictures.size();i++) {
   Picture picture = Picture.findById(pictures.get(i).id);
   byte[] b = picture.image.data; 
   System.out.println(picture.file_name + " " + b.length);
   //Do extra stuff with image data

   picture.em().clear(); //clear JPA entity manager
}
于 2013-02-14T01:19:01.440 に答える
1

次のような画像ではなく、ファイル名のリストを作成してみてください。

List<string> picturefiles = Picture.*findAllFilenames*(); //Around 2GB of data (uses JPA/play framework)

for (String picturefile : picturefiles ) {
  picture  o = new picture(picturefile)
  byte[] b = picture.image.data; //Image raw data is stored in a different table than Picture table
  System.out.println(picture.file_name + " " + b.length);
}
于 2013-02-13T06:12:35.257 に答える