Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.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
Ruby on rails Ruby和PostgreSQL单行模式_Ruby On Rails_Ruby_Postgresql_Memory_Memory Leaks - Fatal编程技术网

Ruby on rails Ruby和PostgreSQL单行模式

Ruby on rails Ruby和PostgreSQL单行模式,ruby-on-rails,ruby,postgresql,memory,memory-leaks,Ruby On Rails,Ruby,Postgresql,Memory,Memory Leaks,我正在使用Ruby从PostgreSQL数据库获取行。这是在单行模式下完成的,如pggem站点() 我按预期分别获得结果集的所有行。然而,对于大型结果集,Ruby似乎将它们保存在内存中。这使得Ruby程序在内存耗尽时终止 有没有办法释放已处理行的空间? 我想我应该使用clear()或autoclear?,但我不确定如何使用它以及具体清除什么。除非autoclear?选项返回true,否则必须调用clear(),否则会导致内存泄漏。如果有足够大的结果集,可能还需要手动清除 请检查此链接 祝你好运

我正在使用Ruby从PostgreSQL数据库获取行。这是在单行模式下完成的,如
pg
gem站点()

我按预期分别获得结果集的所有行。然而,对于大型结果集,Ruby似乎将它们保存在内存中。这使得Ruby程序在内存耗尽时终止

有没有办法释放已处理行的空间?
我想我应该使用
clear()
autoclear?
,但我不确定如何使用它以及具体清除什么。

除非
autoclear?
选项返回true,否则必须调用
clear()
,否则会导致内存泄漏。如果有足够大的结果集,可能还需要手动清除

请检查此链接

祝你好运

尝试使用approve(添加
限额
抵销


也许不是postgres在内存中保存行,而是您的代码?我很确定它不是postgres。我认为这是我的代码或者pg gem我猜问题是它是pg gem,我可以使用一些替代品,或者如果gem是正确的,我的cide是错误的。请注意pg gem被大量使用,所以如果它真的是这样,我会感到惊讶one@maax:是的,我就是这个意思。为什么你认为它是
pg
gem?这不清楚整个结果吗?过去和未来的争吵?我所能说的一切都被清除了。这正是我的问题,因为我的结果太大,无法放入内存中,我无法将其拆分为单独的查询。这会起作用,我面临的唯一问题是postgres会重新排序行,这会给我重复的行,我会错过一些行。我想我的问题是,我是否可以使用ruby来完成它,而不使用偏移量和限制(不一定是pg gem——也许还有一个我不知道的?)或者如果我不得不改变我的postgres设置来使用limit和offset@maax您可以通过添加
orderbyid
对记录进行排序。您的内存泄漏显示在ruby代码中(不在postgres服务器中)。因为Ruby有很重的垃圾收集器。这是Rails团队建议的处理可能的无限记录收集的方法。你可以在那里检查他们是如何解决的:
按id排序
对于一个大表来说是不是带来了巨大的开销,还是我弄错了?好的,这让我走上了正确的道路。我现在使用了一个索引的
id
postgres中的字段始终具有相同的元素顺序。然后,我为您的
循环的每一轮重新启动ruby脚本,同时执行
循环。我这样做是因为您的解决方案仍然存在与我的原始解决方案相同的内存泄漏。我不知道为什么。关于为什么仍然泄漏的评论非常受欢迎。
conn.send_query( "first SQL query" )
conn.set_single_row_mode
conn.get_result.stream_each do |row|
    # do something with the received row of the first query
end
limit  = 1000
offset = 0

while do
  conn.send_query("SELECT * FROM users LIMIT #{limit} OFFSET #{offset}")
  conn.set_single_row_mode
  records = conn.get_result

  if records.any?
    limit  += 1000
    offset += 1000
    sleep(5)
  else
    break
  end
  records.stream_each do |row|
    # do something with the received row of the first query
  end
end