r-在hstore查询中超过PostgreSQL堆栈深度限制,尽管查询为<2毫巴



我在尝试将一行从R存储到PostgreSQL时遇到stack depth limit exceeded。为了解决批量问题,我一直在使用这样的查询:

sql_query_data <- sprintf("BEGIN;
                        CREATE TEMPORARY TABLE 
                          ts_updates(ts_key varchar, ts_data hstore, ts_frequency integer) ON COMMIT DROP;
                          INSERT INTO ts_updates(ts_key, ts_data) VALUES %s;
                          LOCK TABLE %s.timeseries_main IN EXCLUSIVE MODE;
                          UPDATE %s.timeseries_main
                          SET ts_data = ts_updates.ts_data,
                          ts_frequency = ts_updates.ts_frequency
                          FROM ts_updates
                          WHERE ts_updates.ts_key = %s.timeseries_main.ts_key;
                          INSERT INTO %s.timeseries_main
                          SELECT ts_updates.ts_key, ts_updates.ts_data, ts_updates.ts_frequency
                          FROM ts_updates
                          LEFT OUTER JOIN %s.timeseries_main ON (%s.timeseries_main.ts_key = ts_updates.ts_key)
                          WHERE %s.timeseries_main.ts_key IS NULL;
                          COMMIT;",
                          values, schema, schema, schema, schema, schema, schema, schema)

}

到目前为止,这个查询在保持较低插入次数的同时,可以很好地更新数百万条记录。到目前为止,每当我遇到堆栈大小的问题时,我都会简单地将记录分成多个块,然后继续。

然而,这种策略现在面临一些麻烦。我不再有很多唱片了,但有一些hstore稍大一些。但无论如何,它都不是真正的"大"。我阅读了@Craig Ringer的建议,他建议不要接近1GB的限制。因此,我认为hstore本身的大小不是问题所在,但我收到了以下消息:

Error in postgresqlExecStatement(conn, statement, ...) : RS-DBI driver: (could not Retrieve the result : ERROR: stack depth limit exceeded HINT: Increase the configuration parameter "max_stack_depth" (currently 2048kB), after ensuring the platform's stack depth limit is adequate. )

编辑:我确实将限制增加到了7MB,但遇到了同样的错误,说7MB是不够的。这对我来说真的很奇怪,因为我的查询本身只有1.7MB(通过将其粘贴到文本文件来检查)。有人能解释一下吗?

根据提示增加max_stack_depth。[来自官方文件](http://www.postgresql.org/docs/9.1/static/runtime-config-resource.html):

此参数的理想设置是内核强制执行的实际堆栈大小限制(如ulimit-s或本地等效设置),减去大约一兆字节的安全裕度

默认设置为2兆字节(2MB),这是保守的小容量,不太可能发生崩溃。

超级用户可以更改每个连接的此设置,也可以通过postgresql.conf文件为所有用户设置此设置(需要重新启动postgres服务器)。

相关内容

最新更新