【问题标题】:java.lang.OutOfMemoryError when looping through a large table using JPAjava.lang.OutOfMemoryError 使用 JPA 循环遍历大表时
【发布时间】:2023-03-19 03:24:01
【问题描述】:
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,因为图片存储在数据库中,而不是数据库中的文件引用。

一旦对象完成处理,我是否可以“刷新”内存? 我试过picture.em().flush()Iterator.remove(), System.gc(),都没有奏效。 请帮忙。

【问题讨论】:

    标签: java jpa playframework


    【解决方案1】:

    似乎我找到了解决方案。每张图片后清除实体管理器。

    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
    }
    

    【讨论】:

      【解决方案2】:

      尝试创建文件名列表而不是图片,例如:

      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);
      }
      

      【讨论】:

      • 图片存储在数据库而不是平面文件中,否则您的解决方案将起作用。无论如何我都试过了,没有用。 `for(int i=0;i&lt;pictures.size();i++) {Picture picture = Picture.findById(pictures.get(i).id);byte[] b = picture.image.data; System.out.println(picture.file_name + " " + b.length);}
      • @DavidDalcu 我对 jpa 不熟悉,但是当您浏览图片列表时,您的列表已经从数据库加载到内存,这就是为什么我认为参考列表不需要这么多内存并且您加载每次都是您需要的。
      猜你喜欢
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-22
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多