【问题标题】:Postgres -> ERROR: invalid memory alloc request size 1212052384Postgres -> 错误:无效的内存分配请求大小 1212052384
【发布时间】:2018-12-13 09:51:54
【问题描述】:

在向表中运行插入查询时,我在 psql (10.4) 中收到此错误。

ERROR:  invalid memory alloc request size 1212052384

我尝试插入的数据是地理点数据,我猜测(因为文件大小为 303MB)大约有 2-3 百万个点,即单个记录。这对于一次性插入来说太大了吗? sql查询如下;它从文本文件复制 JSON 数据并插入数据库。尝试将单个形状存储为记录而不是点会更好,即更少的内存?

delete from shapes;

create temporary table temp_json (values text);
copy temp_json from '/Users/me/model/json/shapes_routes.json';
insert into shapes

select  values->>'shape_id' as shape_id,
        (CAST(values->>'shape_pt_lat' as real)) as shape_pt_lat,
        (CAST(values->>'shape_pt_lon' as real)) as shape_pt_lon,
        (CAST(values->>'shape_pt_sequence' as integer)) as shape_pt_sequence,
        (CAST(values->>'shape_dist_traveled' as real)) as shape_dist_traveled,
        values->>'route_id' as route_id

from   (
           select json_array_elements(replace(values,'\','\\')::json) as values 
           from   temp_json
       ) a;

drop table temp_json;

【问题讨论】:

  • Postgres 有任何单个值(例如临时表元组中的字符串)不能超过 1 GB 的内部限制。是否有可能某些字符串 concat 操作会在 RAM 中生成超过 1 GB 的字符串?

标签: json postgresql psql


【解决方案1】:

在大多数情况下,关系数据库不能很好地处理大量数据的批处理,其中最重要的是 RDBMS 日志记录要求,它对一个事务中的数据更改设置了最大限制。

将大量数据移入是一个操作问题,因此操作方法是一个很好且合乎逻辑的选择。

在数据库外部(使用命令行工具)将您的文件分解为许多较小的文件,每个文件 10K 大小,然后像加载单个大文件一样加载它们 - 将分块逻辑保持在 外部数据库。

【讨论】:

  • 好的,非常感谢。我假设你的意思是 10K 点?
  • @ozzyzig 10K 的“事物”(在本例中为点)。我发现这个数量是一个很好的起点,但是您应该尝试找到永远不会爆炸的最大文件大小。我会找到会出错的最小尺寸并使用其中的一半。
【解决方案2】:

300MB 确实很小,我今天早些时候插入了 28GB。 (但我使用了COPY tablename FROM STDIN

您可以尝试将a 重写为 CTE 而不是子查询。

【讨论】:

    猜你喜欢
    • 2019-06-16
    • 1970-01-01
    • 2021-12-12
    • 2022-12-18
    • 1970-01-01
    • 2012-03-17
    • 2013-07-11
    • 1970-01-01
    • 2016-05-14
    相关资源
    最近更新 更多