Groovy 捕获:java.lang.OutOfMemoryError:java堆空间-使用-Xmx不适用
我用Groovy编写了一个非常复杂的数据库迁移脚本,它在我的工作站上运行得很好,但在服务器的JVM上运行时会产生“catch:java.lang.OutOfMemoryError:java heap space”。JVM被困在原地(实习生的资源有限),所以除了增加可用内存之外,我还需要找到另一种方法来解决这个问题 当访问一些最大的表时会出现错误:一个特别大但简单的联接(200000多行到50000多行)。有没有其他方法可以让我接近这样的连接,从而避免出错 查询示例:Groovy 捕获:java.lang.OutOfMemoryError:java堆空间-使用-Xmx不适用,groovy,jvm,out-of-memory,Groovy,Jvm,Out Of Memory,我用Groovy编写了一个非常复杂的数据库迁移脚本,它在我的工作站上运行得很好,但在服务器的JVM上运行时会产生“catch:java.lang.OutOfMemoryError:java heap space”。JVM被困在原地(实习生的资源有限),所以除了增加可用内存之外,我还需要找到另一种方法来解决这个问题 当访问一些最大的表时会出现错误:一个特别大但简单的联接(200000多行到50000多行)。有没有其他方法可以让我接近这样的连接,从而避免出错 查询示例: target.query("
target.query("""
SELECT
a.*, b.neededColumn
FROM
bigTable a JOIN mediumTable b ON
a.stuff = b.stuff
ORDER BY stuff DESC
""") { ResultSet rs ->
...
}
能否在数据库服务器上运行加入SQL 如果不是这样,您可能需要遍历200000个结果中的每一个,并将其连接到50000行,然后写出结果(因此您在内存中每次存储的结果不会超过1*50000个) 或者,如果您可以访问多台机器,您可以将200000个项目划分为块,然后每台机器执行一个块 编辑 以您的示例代码为例,您应该能够做到:
new File( 'output.csv' ).withWriter { w ->
target.eachRow( '''SELECT a.a, a.b, a.c, b.neededColumn FROM
bigTable a
JOIN mediumTable b ON a.stuff = b.stuff
ORDER BY stuff DESC''' ) { row ->
w.write "$row.a,$row.b,$row.c,$row.neededColumn"
}
}
这将把每一行写入文件
output.csv
您可以在数据库服务器上运行加入SQL吗
如果不是这样,您可能需要遍历200000个结果中的每一个,并将其连接到50000行,然后写出结果(因此您在内存中每次存储的结果不会超过1*50000个)
或者,如果您可以访问多台机器,您可以将200000个项目划分为块,然后每台机器执行一个块
编辑
以您的示例代码为例,您应该能够做到:
new File( 'output.csv' ).withWriter { w ->
target.eachRow( '''SELECT a.a, a.b, a.c, b.neededColumn FROM
bigTable a
JOIN mediumTable b ON a.stuff = b.stuff
ORDER BY stuff DESC''' ) { row ->
w.write "$row.a,$row.b,$row.c,$row.neededColumn"
}
}
这将把每一行写入文件
output.csv
您必须更改代码,以使这些行不会同时全部加载到内存中(即,流式传输数据,一次处理每一行)。据我所知,Groovy在使用诸如收集之类的东西时仍然不能做到这一点,因此请重写它以使用for循环。您必须更改代码,以便不会同时将所有行加载到内存中(即流式传输数据,一次处理一行)。据我所知,Groovy在使用collect
之类的东西时仍然不会这样做,因此请重写它以使用for循环。@Fernandez我不确定,我没有使用游标的经验。你能提供进行db调用的代码的相关部分吗?@Fernandez我添加了一个示例。这正是我在更改名称时所做的。@Fernandez我不确定,我没有使用游标的经验。你能提供进行db调用的代码的相关部分吗?@Fernandez我添加了一个示例。这正是我做的,只是换了名字。这会有帮助吗?我不确定,但我的印象是,记忆问题与连接有关,而不是结果?如果你错了,那么肯定会有帮助。我没有你的数据,没有你的系统,也没有你的内存限制,所以你比我更适合尝试。不幸的是,我在修改您的示例时遇到了一些困难,因为我的代码严重依赖于结果集的使用。如果我有事情要做,我会发帖的。在那之前,我会接受你的回答,谢谢。如果你被卡住了,请喊我一声,我会尽力帮助你:-)这会有帮助吗?我不确定,但我的印象是,记忆问题与连接有关,而不是结果?如果你错了,那么肯定会有帮助。我没有你的数据,没有你的系统,也没有你的内存限制,所以你比我更适合尝试。不幸的是,我在修改您的示例时遇到了一些困难,因为我的代码严重依赖于结果集的使用。如果我有事情要做,我会发帖的。在那之前,我会接受你的回答,谢谢。如果你被卡住了,请喊我一声,我会尽力帮助你:-)