Postgres -> ОШИБКА: неверный размер запроса на выделение памяти 1212052384 - PullRequest
0 голосов
/ 05 июля 2018

Я получаю эту ошибку в psql (10.4) при выполнении запроса на вставку в таблицу.

ERROR:  invalid memory alloc request size 1212052384

Данные, которые я пытаюсь вставить, представляют собой данные о географических точках, и я предполагаю (так как размер файла составляет 303 МБ) около 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 голосов
/ 05 июля 2018

300 МБ довольно мало, я сегодня вставил 28 ГБ. (но я использовал COPY tablename FROM STDIN)

Вы можете попробовать переписать a как CTE, а не как подзапрос.

0 голосов
/ 05 июля 2018

В большинстве случаев реляционные базы данных не очень хорошо справляются с пакетной обработкой больших объемов данных, не в последнюю очередь это требования к ведению журналов СУБД, которые устанавливают максимальный лимит на изменения данных в одной транзакции.

Перемещение большого количества данных - это операционная проблема , поэтому оперативный подход является хорошим и логичным выбором.

Разбейте ваш файл, внешне к БД (используя инструменты командной строки), на множество файлов меньшего размера, скажем, по 10 КБ каждый, и загрузите их, как если бы это был один большой файл - оставьте логику разбиения на части вне DB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...