我在尝试将一行从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服务器)。