2016-10-19 5 views
0

Мы используем Hapijs/React/Sequelize/MySQL. Меня что-то вызывает, и я сделал некоторые исследования в этом вопросе.Обработать и отправить большой объем данных с помощью Hapijs

Установка:

Мы Реагировать компонент, который выдает AJAX вызов Хапи API. API возвращает массив объектов. Это отображается в React. Выпуск: Мы запрашиваем данные из таблицы. Эти данные возвращаются как массив сложных объектов. Каждый из этих объектов является объектом sequlize. И у него есть много дополнительных свойств, которые нам не нужны. Мы посылаем этот объект, используя hapı ответ, что-то вроде (40k) объектов:

flattenedParts.forEach(function(item) { 
      item.dataValues.Product = productsMap[item.dataValues.ProductId] || []; 
      item.dataValues.PartModule = partModulesMap[item.dataValues.PartModuleId] || []; 
      fullObjects.push(item); 
     }); 

     reply(fullObjects).code(200); 

Когда код достигает ответное заявление, он занимает 14 секунд, пока не будет отправлять его как простой массив объектов JSON.

Для меня кажется, что сериализация этих объектов занимает много времени. Поэтому я подумал о создании массива простых объектов, которые нужны только мне. Я сделал что-то вроде этого (40k объектов) ::

flattenedParts.forEach(function(item) { 
      item.Product = productsMap[item.dataValues.ProductId] || []; 
      item.PartModule = partModulesMap[item.dataValues.PartModuleId] || []; 
      var flat = new partCreator(item); 
      newParts.push(flat); 
     }); 

     reply(fullObjects).code(200); 

Функция части Творца просто:

function partCreator(part){ 
    this.Product = {}; 
    this.id = part.dataValues.id; 
    this.PartNumber = part.dataValues.PartNumber; 
    ... 
    } 

Таким образом, в конце концов, я в конечном итоге с массивом с простыми объектами, содержащих данные, Мне нужно. Скорость теперь составляет около 7 секунд. Почти 50% прироста скорости. Но если я прав, это должно быть намного быстрее. Что происходит за кулисами с помощью функции , и как я могу ускорить это?

+1

Попробуйте синхронизировать 'JSON.stringify()' на 'fullObjects'. Возможно, вы просто пытаетесь создать огромную структуру данных. Вам действительно нужно отправить все это клиенту? –

+0

В текущем проекте у нас есть сетка данных, которая отображает все результаты. В этой сетке данных много фильтров, которые по дизайну дадут результаты только с полным набором данных. Возможно, нам нужно переосмыслить текущий дизайн ... просто еще ничего не знаю :( –

ответ

1

Существует не так много вещей, чтобы использовать производительность, когда вы хотите вернуть обратно объекты 40K (!). У вас скоро будут проблемы масштабирования, в больших масштабах вы не сможете обрабатывать и обрабатывать так много объектов в памяти на вашем сервере. Цель REST API - получить запрос и быстро вернуть небольшой объем данных. Вы должны ограничить объем данных, которые вы загружаете в память, и не должны превышать 100 (даже 100 - это много). Вы должны расширить свой API для поддержки всех функций, которые вы хотите (разбиение на страницы, сортировка, поиск и т. Д.), А также расширение клиента для подачи большего количества запросов на ваш API. Кстати, некоторые из браузеров, которые работают на устройствах, которые не так быстро, также будут иметь проблемы с производительностью.

+0

Вы просто доверяете моим мыслям. Вместо того, чтобы вытаскивать их все, я сделаю какую-то рекурсию, чтобы получить их в кусках. Возможно, 20 тыс. Кусков (занимает 3 секунды, чтобы получить его). –

+0

@Wexoni вы собираетесь представить все строки 20k на экране пользователя? –

+0

Мне нужно одновременно отображать 500k на экране. У нас есть DataGrid, который работает быстро и способный сделать это. –

 Смежные вопросы

  • Нет связанных вопросов^_^