1

我在运行的 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"
4

3 回答 3

3

除非您重新编译 PostgreSQL,否则无法升级限制(此处定义)。

我的建议是尝试减小有效负载的大小(您确定需要所有数据吗?)或在多个请求中获取所有有效负载。

使用 PostgREST,您可以进行垂直过滤(只需选择您需要的列)或分页以减少您在一个请求中获得的行数。

于 2019-06-26T00:03:15.617 回答
0

错误消息来自 PostgreSQL。PostgREST 只是将消息包装在 JSON 中并发送 HTTP 响应。

作为查找问题的第一步,查看触发错误的确切 HTTP 请求是什么。

然后,启用PostgreSQL 日志记录并重复请求,检查日志,然后您将看到导致此错误的 SQL 查询是什么。通过 pgAdmin 或 psql 运行查询以确保您得到有问题的查询。

用你的发现更新你的问题。SQL 查询将是继续所需要的。

之后,您可以在您的问题中添加一个 postgresql 标签。

于 2019-06-23T05:41:26.333 回答
0

由于多种原因,导入的文件总是有可能损坏或格式错误。

我只是碰巧发现我的文件有一些不正确的行尾(长故事,这里不需要),这导致整个文件显示为一行,从而导致明显的结果。在您的情况下,您可能有类似的情况需要查找+替换类型的解决方案。

为了对其他人有任何好处,我用它来解决它:

tr -d '\0' < bad_file.csv > bad_file.csv.fixed

于 2021-05-21T03:22:33.790 回答