- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我需要从数据库中导出大量数据。这是代表我的数据的类:
public class Product{
...
@OneToMany
@JoinColumn(name = "product_id")
@Cascade({SAVE_UPDATE, DELETE_ORPHAN})
List<ProductHtmlSource> htmlSources = new ArrayList<ProductHtmlSource>();
...
ProductHtmlSource
- 包含我实际需要导出的大字符串。
由于导出数据的大小大于 JVM 内存,我正在按 block 读取数据。像这样:
final int batchSize = 1000;
for (int i = 0; i < 50; i++) {
ScrollableResults iterator = getProductIterator(batchSize * i, batchSize * (i + 1));
while (iterator.getScrollableResults().next()) {
Product product = (Product) iterator.getScrollableResults().get(0);
List<String> htmls = product.getHtmlSources();
<some processing>
}
}
getProductIterator
代码:
public ScrollableResults getProductIterator(int offset, int limit) {
Session session = getSession(true);
session.setCacheMode(CacheMode.IGNORE);
ScrollableResults iterator = session
.createCriteria(Product.class)
.add(Restrictions.eq("status", Product.Status.DONE))
.setFirstResult(offset)
.setMaxResults(limit)
.scroll(ScrollMode.FORWARD_ONLY);
session.flush();
session.clear();
return iterator;
}
问题是,尽管我在读取每个数据 block 后清除了 session ,但 Product
对象在某处累积并且我得到了 OutOfMemory 异常。问题不在于处理代码块,即使没有它我也会收到内存错误。批处理的大小也不是问题,因为 1000 个对象很容易进入内存。
Profiler 显示对象在 org.hibernate.engine.StatefulPersistenceContext
类中累积。
堆栈跟踪:
Caused by: java.lang.OutOfMemoryError: Java heap space
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:99)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:518)
at java.lang.StringBuffer.append(StringBuffer.java:307)
at org.hibernate.type.TextType.get(TextType.java:41)
at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:163)
at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:154)
at org.hibernate.type.AbstractType.hydrate(AbstractType.java:81)
at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2101)
at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1380)
at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1308)
at org.hibernate.loader.Loader.getRow(Loader.java:1206)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:580)
at org.hibernate.loader.Loader.doQuery(Loader.java:701)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
at org.hibernate.loader.Loader.loadCollection(Loader.java:1994)
at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:36)
at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:565)
at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:63)
at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1716)
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:344)
at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86)
at org.hibernate.collection.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:109)
at org.hibernate.collection.PersistentBag.size(PersistentBag.java:225)
**at com.rivalwatch.plum.model.Product.getHtmlSource(Product.java:76)
at com.rivalwatch.plum.model.Product.getHtmlSourceText(Product.java:80)
at com.rivalwatch.plum.readers.AbstractDataReader.getData(AbstractDataReader.java:64)**
最佳答案
您似乎在调用 getProductIterator() 时带有起始行号和结束行号,而 getProductIterator() 需要起始行和行数。随着您的“上限”越来越高,您正在读取更大的数据 block 。我认为您的意思是将 batchSize 作为第二个参数传递给 getProductIterator()。
关于java - 使用hibernate读取大量数据时OutOfMemory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2242999/
我正在调查我们的应用程序运行缓慢的问题,最终导致集群环境中的一个实例出现故障。几周前我遇到了以下错误: [#|2012-05-11T14:12:03.460-0400|SEVERE|sun-appse
我创建了一个应用程序,基本上使用机器人在客户端获取图像并每隔几秒发送一次到服务器,这样我就可以看到另一台 PC 上发生了什么。问题似乎是它一直将图像保存在数组或其他东西中,因为几秒钟后,它崩溃了。我只
我正在使用 universal-image-loader-1.6.2.jar(最新的)。我正在尝试使用此库下载并缓存该图像。我要从服务器下载 47 张图片,总共 5.22 Mb。我的最大图片尺寸为 7
我在玩 Scala 的惰性迭代器,但遇到了一个问题。我想要做的是读取一个大文件,进行转换,然后写出结果: object FileProcessor { def main(args: Array[S
当涉及到服务器环境的垃圾收集/内存限制时,.Net 框架的行为是否可能有所不同?我在具有 32gbs 物理内存的 64 位服务器计算机上显式运行 x86 编译的应用程序,并且内存不足(SystemOu
在我的应用程序启动时,我正在创建具有 75*10^6 容量的长哈希集。 Profiler 显示,该应用程序使用 1.4g。我尝试设置-Xmx1600m,但发现内存不足。 -Xmx2000m 相同。 -
我有一项关于使用数字列表构建金字塔的任务,但一项测试存在一个问题。在我的任务中,我需要对列表进行排序。我使用 Collections.sort(): Collections.sort(inputNum
在对我为 Windows Mobile 编写的类库进行一些最终测试时(使用 Compact Net Framework 2.0),我遇到了 OOM 异常。 基本上,我的库首先加载一个字典文件(一个带有
编辑:我将其重新表述为问题并将答案移至答案部分... 在一个相对复杂的多线程 .NET 应用程序中,我遇到了 OutOfMemoryException,即使在我认为没有理由的情况下也是如此。 情况:
当我尝试使用下面的方法将一些文本内容设置到我们心爱的窗口的剪贴板时 片段,它在 10-15MB 的范围内工作正常。但是超过这个大小,它会抛出一条错误消息 显示在最后。我们如何将 30+ MB 的 ut
我想在 Android 中将 PDF 图像发送到服务器。 服务器规范需要我应该使用 Base64 编码。 所以我应该将 PDF 图像文件转换为 Base64 字符串。 下面是 HTTP POST 请求
我正在解析设备上的二进制文件并将我关心的字段存储在数组中。这些文件可以生成大小为 100,000 的数组。自然地,java 告诉我内存不足(我认为 android 每个应用程序只允许 16MB)。 还
我正在尝试从一个 txt 文件(书籍)中读取,然后将它的每一行添加到一个链表中。但是,当我运行代码时,我在 l.add(line); 处遇到内存不足错误。你能告诉我这段代码做错了什么吗?或者,是否有更
我通过允许用户选择要显示的图片从 SD 卡加载位图。创建位图后,我在 ImageView 中设置位图: mBitmap = Bitmap.createBitmap(Media.getBitmap(th
我试图在 gridview 中显示很多图像。有两个 Activity 。它们都有 gridviews,其中有图像。当我只启动其中一个时。没有问题,但是当我启动另一个时,存在“outifmemory”问
我需要在我的应用程序中显示许多图像。这些是 jpg 和 png,我将它们加载到 ImageView 中,如下所示: tile.setImageResource(R.drawable.tile_high
我正在开发一个远程备份应用程序,有时我需要上传大文件,例如 15 MB,我在一些手机上测试过我遇到内存不足的错误 有没有办法使用这个函数来使用更少的内存? public int uploadFile(
我在模拟器和设备(acer 平板电脑和三星 galaxy)上运行我的项目时出现 OutOfMemory 异常,显示 the application launcher process com.andro
我有一个程序可以为目录(子)树中的每个文件创建一个对象。在磁盘越来越大的今天,没有办法知道会有多少文件,尤其是。不是几年(几个月?)从现在开始。 我的程序不是企业关键的;它是用户分析该子树的工具。所以
我已经使用以下命令从命令行启动了我的jar java -Xms1200m -Xmx1500m -jar xxx.jar 我正在创建大小为 12600 * 12600 的 BufferedImage 意
我是一名优秀的程序员,十分优秀!