Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Groovy 捕获:java.lang.OutOfMemoryError:java堆空间-使用-Xmx不适用_Groovy_Jvm_Out Of Memory - Fatal编程技术网

Groovy 捕获:java.lang.OutOfMemoryError:java堆空间-使用-Xmx不适用

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("

我用Groovy编写了一个非常复杂的数据库迁移脚本,它在我的工作站上运行得很好,但在服务器的JVM上运行时会产生“catch:java.lang.OutOfMemoryError:java heap space”。JVM被困在原地(实习生的资源有限),所以除了增加可用内存之外,我还需要找到另一种方法来解决这个问题

当访问一些最大的表时会出现错误:一个特别大但简单的联接(200000多行到50000多行)。有没有其他方法可以让我接近这样的连接,从而避免出错

查询示例:

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我添加了一个示例。这正是我做的,只是换了名字。这会有帮助吗?我不确定,但我的印象是,记忆问题与连接有关,而不是结果?如果你错了,那么肯定会有帮助。我没有你的数据,没有你的系统,也没有你的内存限制,所以你比我更适合尝试。不幸的是,我在修改您的示例时遇到了一些困难,因为我的代码严重依赖于结果集的使用。如果我有事情要做,我会发帖的。在那之前,我会接受你的回答,谢谢。如果你被卡住了,请喊我一声,我会尽力帮助你:-)这会有帮助吗?我不确定,但我的印象是,记忆问题与连接有关,而不是结果?如果你错了,那么肯定会有帮助。我没有你的数据,没有你的系统,也没有你的内存限制,所以你比我更适合尝试。不幸的是,我在修改您的示例时遇到了一些困难,因为我的代码严重依赖于结果集的使用。如果我有事情要做,我会发帖的。在那之前,我会接受你的回答,谢谢。如果你被卡住了,请喊我一声,我会尽力帮助你:-)