我在运行的postgREST API上遇到无法放大字符串缓冲区消息。我猜有些表太大了,无法成功使用API。
我正在使用https://hub.docker.com/r/postgrest/postgrest中的docker postgrest / postgrest容器和PostgREST 5.1.0版本。
一切正常,但是如果表的大小太大,我将收到以下错误消息。
hint null
details "Cannot enlarge string buffer containing 1073741822 bytes by 1 more bytes."
code "54000"
message "out of memory"
我无法确定阈值何时起作用。 是否有可能扩大某些配置文件中的字符串缓冲区,或者这是硬编码的?
使用API的表格大小是否有限制?到目前为止,我在文档中找不到任何信息。
============更新
postgres日志为我提供了以下SQL查询:
WITH pg_source AS (
SELECT "public"."n_osm_bawue_line".*
FROM "public"."n_osm_bawue_line"
)
SELECT null AS total_result_set,
pg_catalog.count(_postgrest_t) AS page_total,
array[]::text[] AS header,
coalesce(json_agg(_postgrest_t), '[]')::character varying AS body
FROM (
SELECT *
FROM pg_source
) _postgrest_t
我使用以下postgres版本:
"PostgreSQL 11.1 (Debian 11.1-1.pgdg90+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516, 64-bit"
答案 0 :(得分:0)
该错误消息来自PostgreSQL。 PostgREST只是将消息包装为JSON并发送HTTP响应。
作为发现问题的第一步,请查看执行触发错误的确切HTTP请求是什么。
然后,启用PostgreSQL logging并重复请求,检查日志,然后您将看到引起此错误的SQL查询是什么。通过pgAdmin或psql运行查询,以确保查询到问题。
用您的发现更新您的问题。将继续执行SQL查询。
之后,您可以在问题中添加一个PostgreSQL标记。
答案 1 :(得分:0)
除非重新编译PostgreSQL,否则无法升级限制(定义为here)。
我的建议是尝试减少有效载荷的大小(确定要使用所有数据吗?)或在多个请求中获得所有有效载荷。
使用PostgREST,您可以进行vertical filtering(只需选择所需的列)或paginate来减少在一个请求中获得的行数。
答案 2 :(得分:0)
由于各种原因,导入的文件总是有可能损坏或格式错误。
我碰巧在我的案例中发现我的文件有类似不正确的行结尾(长篇大论,这里没有必要)导致整个文件显示为一行,从而导致明显的结果。您的情况可能有类似的情况,需要查找+替换类型的解决方案。
为了其他人的利益,我用这个来解决它:
<块引用>tr -d '\0'