2013-04-29 3 views
1

이것은 오버플로 스택에 대한 첫 번째 질문이지만 지난 2 년 동안 SO를 사용해 왔으며 풍부한 정보를 제공했습니다.Node.js를 사용하여 대량 데이터로드

저는 최근에 NodeJS를 선택했고 딜레마에 빠졌습니다. NodeJS를 사용하여 약 2000 행의 데이터를로드/삽입하는 가장 좋은 방법을 찾고, 가능한 경우 기본 비동기 방법론을 사용합니다. API에서 데이터를 가져 와서 JSON 데이터를 가져 와서 나중에 데이터를 사용할 수 있도록 데이터를 3 개의 테이블로로드해야합니다. 이 파일에는 17 개의 Country 개체가 있고 77 개의 State 개체와 약 2,000 개의 Count 개체가 있습니다. 내가 구문 분석하고

JSON 파일 형식은 다음과 같습니다 내 PHP의 backround에 너무

[{Country:{ 
    Name: ... 
    CountryId: ... 
    States: { 
     Name: ... 
     StateId: ... 
     Counties: { 
     Name: ... 
     CountyId:... 
     } 
    } 
    },{Country+n:{ 
    Name: ... 
    CountryId: ... 
    States: { 
     Name: ... 
     StateId: ... 
     Counties: { 
     Name: ... 
     CountyId:... 
     } 
    } 
    }]; 

, 나는 즉시 자바 스크립트에 다음과 같은 세 가지 기능을 만들 것입니다 :
function Country(data){ 
    for(var z in data){ 
     var country = data[z]; 
     InsertInCountryDB(country.CountryId, country.Name); 
     State(Country.State); 
    } 
} 

    function State(data){ 
     for(var z in data){ 
      var state = data[z]; 
      InsertInStateDB(state.StateId, state.Name); 
      State(Country.State); 
     } 
    } 

    function County(data){ 
     for(var z in data){ 
      var county = data[z]; 
      InsertInCountyDB(county.CountyId, county.Name); 
     } 
    } 

나의 첫번째 시도

이왔다 각 개체에 대한 이벤트를 만든 다음 이벤트를 사용하여 자체 개체를 드릴 다운 한 다음 데이터를 삽입합니다. 국가 및 주 세부 정보를 DB에 삽입하는 것이 효과적이지만 카운티 데이터를 사용하면 오류가 발생합니다.

내 문제에 대한 답변을 찾는 것이 아니라 오히려 3 가지 동기 함수에서 벗어나 비동기 기능을 사용하는 데 유용한 코딩 팁을 제공합니다.

감사합니다.

+0

어느 DB입니까? 너 뭐 해봤 니? EventEmitters? 콜백? – TheHippo

+0

2000 행은 매우 빨라야합니다. 내가 hav는 비동기 문제없이 mongo에 여러 파일에서 7 밀리 기록을 삽입하는 스크립트를 썼습니다. 그래서 어떤 데이터베이스를 사용하고 있습니까? – wayne

+0

postgres DB를 사용하고 있습니다. EventEmitters를 사용했지만, 오늘 아침 Listener와 이벤트를 처음 사용하는 방식을 놓쳤을지도 모른다는 생각을했습니다. 동기식 방법을 사용하여 모든 데이터를 시스템으로 가져올 수있었습니다.그러나 NodeJS의 요점은 비동기 프로그래밍이므로 더 나은 방법을 사용하도록 코드를 다시 작성할 수 있는지 알고 싶습니다. – LorneCurrie

답변

0

2000 너무 나쁘지 않아야합니다. 10000 개 정도의 인서트 같아 보입니다. 큰 규칙은 단일 커밋 (준비된 명령문을 수행 할 수있는 경우 더 좋음)과 끝에 커밋을 실행하는 것입니다.

이제 아키텍처 측면에 대한 질문이 많아지고 PostgreSQL 9.1 이상을 사용하고 있다고 가정하고 (소스에서 추가 컴파일 된 확장을 설치할 수 있음) 내 추천은 매우 다를 것입니다.

CREATE TEMPORARY TABLE upload_holding (payload json); 

그럼 난 그냥 거기에 JSON 문서로 "행"을 삽입합니다 :

내가 임시 테이블을 만들 것이다는 (9.1의 경우 소스의 확장이 필요합니다). 그런 다음 plv8js에 저장 프로 시저를 작성합니다 (JSON을 처리하고 각 부분을 추출 할 수있는 소스에서 개별적으로 설치해야하지만, 대신 자바에서 작업하지 않으려면 pl/perl을 사용할 수 있음). . 그런 다음 함수를 함께 연결하여 행을 세트로 처리하고 삽입을 함께 수행 할 수 있습니다.

전체 예제는 실제로 가능하지 않지만 Perl이나 Javascript를 사용하면 각 엔티티를 JSON 형식으로 가져 와서 튜플로 추출한 다음 해당 튜플을 가져 와서 처리하면 훨씬 쉽게 처리 할 수 ​​있습니다 삽입을 데이터베이스 내부의 JSON 처리에 연결하십시오.

대부분의 기능이 데이터베이스에 있다는 점을 제외하면 비슷할 것이므로 효율적으로 사용하려면 훨씬 적은 계획 오버 헤드가 필요합니다.

관련 문제