2016-10-19 2 views
0

Hapijs/React/Sequelize/MySQL을 사용하고 있습니다. 저를 소중히 여기는 것이 있습니다. 나는이 문제에 대해 조사를 해왔습니다.Hapijs를 사용하여 많은 양의 데이터를 처리하고 보내십시오.

설정 :

우리가 가지고있는 게요 API에 AJAX 호출을 발행하여 구성 요소를 반응한다. API는 객체의 배열을 반환합니다. 그것은 React에 의해 표시되고 있습니다. 문제 : 테이블에서 데이터를 요청합니다. 이 데이터는 복잡한 객체의 배열로 반환됩니다. 이 객체들 각각은 sequlize 객체입니다. 또한 우리에게는 필요없는 많은 추가 속성이 있습니다. 코드가 응답 문에 도달 할 때 JSON 객체와 같은 간단한 배열을 보낼 때까지, 그 14 초 정도 걸립니다

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); 

: 우리는 (40K 객체)와 같은 HAPI 응답, 뭔가를 사용하여 해당 객체를 보낼 수 있습니다.

나를 위해 그것은 그 개체의 직렬화 시간이 오래 걸리는 것 같습니다. 그래서 저는 필요한 데이터만으로 일반 객체 배열을 만들려고했습니다. 나는이 같은 (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

'fullObjects'에서'JSON.stringify()'를 시도해보십시오. 어쩌면 방금 거대한 데이터 구조를 문자열 화하려는 것일 수 있습니다. 이 모든 것을 클라이언트에게 정말로 보내야합니까? –

+0

현재 디자인으로 모든 결과를 보여주는 데이터 그리드가 있습니다. 그 데이터 그리드에는 많은 필터가 있습니다. 설계 상 전체 데이터 세트로만 결과를 얻을 수 있습니다. 현재의 디자인을 다시 생각할 필요가 있을지도 모른다. 단지 아직 아무것도 모른다. ( –

답변

1

40K (!) 개체를 되 돌리려는 경우 성능을 활용하기 위해 할 일이 많지 않습니다. 실제로 스케일링 문제가 발생하게 될 것이며 대규모로 서버의 메모리에있는 많은 객체를 처리하고 처리 할 수 ​​없습니다. REST API의 목적은 요청을 받고 적은 양의 데이터를 빠르게 반환하는 것입니다. 메모리에로드하는 데이터의 양을 제한해야하며 100을 넘지 않아야합니다 (심지어 100 개가 많음). 원하는 모든 기능 (페이지 매김, 정렬, 검색 등)을 지원하고 더 많은 요청을 API로 보내도록 클라이언트를 확장하려면 API를 확장해야합니다. 그런데 꽤 빠르지 않은 장치에서 실행되는 일부 브라우저는 성능 문제도 일으킬 수 있습니다.

+0

당신은 단지 내 생각을 고백한다. 그들을 모두 가져 오는 대신에, 나는 그들을 청크로 가져 오기 위해 일종의 재귀를 할 것이다. 어쩌면 20k 덩어리 3 초 걸리면됩니다.) –

+0

@Wexoni 사용자의 화면에 20k 행을 모두 표시하겠습니까? –

+0

동시에 화면에 500k를 표시해야합니다. 빠르게 실행되는 DataGrid가 있습니다. –

관련 문제