gpt4 book ai didi

java - MongoDB 游标中的内存泄漏 (OutOfMemory)?

转载 作者:可可西里 更新时间:2023-11-01 10:44:12 25 4
gpt4 key购买 nike

这就是我读取大型 MongoDB 表的方式(每个对象的属性中都有非常大的数据 block ):

DBCursor cursor = collection.find(/* my query */);
while (cursor.hasNext()) {
DBObject object = cursor.next();
doSomething(object); // no data stays in memory
}
cursor.close();

我得到:

java.lang.OutOfMemoryError: Java heap space
at java.lang.StringCoding$StringDecoder.decode(Unknown Source)
at java.lang.StringCoding.decode(Unknown Source)
at java.lang.String.<init>(Unknown Source)
at org.bson.BasicBSONDecoder$BSONInput.readUTF8String(BasicBSONDecoder.java:463)
at org.bson.BasicBSONDecoder.decodeElement(BasicBSONDecoder.java:155)
at org.bson.BasicBSONDecoder._decode(BasicBSONDecoder.java:79)
at org.bson.BasicBSONDecoder.decode(BasicBSONDecoder.java:57)
at com.mongodb.DefaultDBDecoder.decode(DefaultDBDecoder.java:56)
at com.mongodb.Response.<init>(Response.java:83)
at com.mongodb.DBPort.go(DBPort.java:124)
at com.mongodb.DBPort.call(DBPort.java:74)
at com.mongodb.DBTCPConnector.innerCall(DBTCPConnector.java:286)
at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:257)
at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:310)
at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:295)
at com.mongodb.DBCursor._check(DBCursor.java:368)
at com.mongodb.DBCursor._hasNext(DBCursor.java:459)
at com.mongodb.DBCursor.hasNext(DBCursor.java:484)

处理完 200-300 个对象后抛出异常。驱动程序是否将数据保存在内存中?我正在使用

<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>2.10.1</version>
</dependency>

最佳答案

驱动程序将保存在内存中的对象数量取决于游标的批量大小。当您没有明确设置时,我不确定默认的批量大小是多少。根据文档的最大大小和可用堆空间量,您应该相应地设置批处理大小。请记住,当前 MongoDB 支持的最大文档大小为 16MB。

参见 DBCursor.batchSize()在 MongoDB Java 驱动程序 API 文档中了解详细信息。

关于java - MongoDB 游标中的内存泄漏 (OutOfMemory)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18684598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com