Поток Postgres/Node to JavaScript: "обход" над строкой занимает слишком много памяти

У меня есть БД Postgres 9.6, подключенная к серверу веб-приложений Node.js 8.9, который обслуживает интерфейс JavaScript.

Я почти везде имею дело с массивами объектов JSON.

Теперь я хочу, чтобы большие наборы данных реализовывали потоковую передачу. Я получил его на работу с помощью JSONStream, pg-query-stream в спину, и Oboe в передней части. Проблема заключается в производительности. Вместо "элемент на элемент" элементы часто вставляются в две большие и разные части: как и в первые 10 секунд, ничего не происходит. Затем вставляется 73 элемента, затем 20 секунд ничего, затем отображаются остальные 1260 элементов.

Для больших наборов данных (около 1600 очень сложных наборов данных) браузер может даже аварийно завершить работу, например, с помощью "Aw, snap" в Chrome.

Я узнал, что Гобой использует substr Функция занимает большую часть памяти. Я думаю, это как-то связано с разбором строки как JSON.

Теперь, это может быть глупый вопрос, но: действительно ли необходимо сначала в бэкэнде привести в порядок вывод JSON из БД, передать его во внешний интерфейс, где он снова анализируется как JSON? Разве нет способа "родной" потоковой передачи массива объектов JSON? Как один объект за другим?

Пока что мой код выглядит так:

Backend

var QueryStream = require('pg-query-stream');
var JSONStream = require('JSONStream');
var pg = require('pg');
var clientPool = new pg.Pool(myDBconfig);

clientPool.connect(function(connectClientError, client, done) {
      var query = new QueryStream('SELECT row_to_json(my_db_function()) AS my_stream_content;');
      var stream = client.query(query);
      stream.on('end', function () {
        done();
      });
      stream.pipe(JSONStream.stringify()).pipe(res);
   });
  }
};

Внешний интерфейс

var bigArrayOfBigObjects = [];
var myOboeObject = oboe({
            url: '/some/url',
            method: 'POST',
            headers: {

            },
            body: {}
        });

        myOboeObject.on('node','{my_stream_content}',function(node) {
            bigArrayOfBigObjects.push(node.my_stream_content);
        });

0 ответов

Другие вопросы по тегам