Postgres->错误:无效的内存分配请求大小1212052384

时间:2018-07-05 01:46:59

标签: json postgresql psql

在表中运行插入查询时,在psql(10.4)中出现此错误。

ERROR:  invalid memory alloc request size 1212052384

我要插入的数据是地理位置数据,我猜测(由于文件大小为303MB)大约2-3百万个点(即单个记录)。这对于INSERT而言太大了吗? 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;

2 个答案:

答案 0 :(得分:0)

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

移动大量数据是可操作的问题,因此可操作的方法是一个明智的选择。

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

答案 1 :(得分:0)

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

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