2017-10-06 2 views
0

스트리밍 데이터가 IP 주소로 수신됩니다. 데이터를 데이터베이스에 저장하기 전에 IP를 경도와 위도로 변환하고 싶습니다.IP 주소가있는 스트리밍 데이터의 node-maxmind 사용량

이것은 내가 뭘하고 있었는지 몇 가지 문제를 일으키는 것입니다. 나는 또한 forObject 외부에 locationObject를 두려고 시도했다. 이상하게도 많은 메모리를 사용하고 있습니다. 나는 이것이 코드를 차단하고 있지만 그것이 빠르다는 것을 안다. 비록 데이터 객체가 스트림에서 계속 나오고 있기 때문에 메모리 문제가 있음에도 불구하고 각 데이터 객체는 거대합니다.

for (var i ==0; i < data.length; i++){ 
     if (data.client_ip !== null) { 
      var locationLookup = maxmind.openSync('./GeoIP2-City.mmdb'); 
      var ip = data.client_ip; 
      var maxmindObj = locationLookup.get(ip); 
      locationObject.country = maxmindObj.country.names.en; 
      locationObject.latitude = maxmindObj.location.latitude; 
      locationObject.longitude = maxmindObj.location.longitude; 
      } 
} 

는 다시 maxmind.openSync ('./ GeoIP2-City.mmdb')를 넣어하려고; outside fr 루프가 메모리를 크게 증가시킵니다.

다른 옵션은 비 차단 코드를

maxmind.open('/path/to/GeoLite2-City.mmdb', (err, cityLookup) => { 
    var city = cityLookup.get('66.6.44.4'); 
}); 

을 사용하는 것입니다 그러나 나는이 루프 내부에이를 넣을 수있는 좋은 마약 단속반 생각하지 않습니다.

어떻게 처리 할 수 ​​있습니까? 같지 "빠른 코드"않는 "코드를 차단"(나는 매 분마다 데이터 객체를 얻고있다

https://github.com/runk/node-maxmind

답변

1

난 당신이 빠른 것 루프의 각 반복에 대한 데이터베이스 파일을 읽는 생각하는 이유를 모르겠어요), 데이터베이스 파일을 한 번 읽은 다음 data을 반복하는 것이 훨씬 좋습니다.

maxmind.openSync()README에서 언급 메모리에 전체 데이터베이스를 읽습니다 :

하는 동기 버전에주의! mmdb 파일은 꽤 큰 파일이므로 (도시 데이터베이스는 약 100MB입니다) fs.readFileSync 블록 전체를 블록으로 처리하고 파일을 버퍼로 읽습니다.

여분의 메모리가없는 경우 다른 옵션은 비동기 적으로 파일을 여는 것입니다. 다시이 아닌 루프 내부에 있지만, 외부 :

maxmind.open("./GeoIP2-City.mmdb", (err, locationLookup) => { 
    for (var i = 0; i < data.length; i++) { 
    if (data.client_ip !== null) { 
     var ip = data.client_ip; 
     var maxmindObj = locationLookup.get(ip); 
     locationObject.country = maxmindObj.country.names.en; 
     locationObject.latitude = maxmindObj.location.latitude; 
     locationObject.longitude = maxmindObj.location.longitude; 
    } 
    } 
}); 
+0

나는 당신이 무엇을 제안하는지 알고 있습니다. 다시이 문제는 나에게이 함수가 여러 번 호출된다는 것입니다. 매우 빠른 속도로 데이터 객체를 얻고 있습니다 (매분 데이터 스트림). 데이터 객체가 수신 될 때마다 IP를 포함하여 루프의 모든 필드를 구문 분석합니다. 즉, 파일이 다시 열릴 때마다 의미합니다. 파일을 사용하지 않고 maxmind를 쿼리하는 다른 방법이 있습니까? maxmind.openSync()는 데이터베이스 전체를 메모리로 읽습니다. 나는 나의 인스턴스에 100MB를 가지고 있지만, 문제는 내가 메모리를 증가시키는 pm2로 실행할 때이다. GC가 정리를 실행하는지 확실하지 않음 –

+0

어떤 솔루션을 선택하든 한 번만 데이터베이스를 열거 나 읽어야합니다. 함수가 많이 호출되고 비동기 적으로 데이터베이스 파일을 열려면 함수 외부에서 열어야합니다. 최상의 솔루션이 무엇인지 응용 구조에 따라 다릅니다. – robertklep

+0

확인. 고마워. 시험과 시험을 해봅시다. 메모리 등을 모니터하고 결과로 당신에게 돌아 가라. –

0

내가 걱정하는 유일한 것은 내가이 기능을 너무 여러 번 호출 시간이 지남에 있습니다. 내 소비자가 kakfa (매분마다)에서 jsonObject를 읽을 때마다. 그것을 최적화하는 훨씬 더 좋은 방법이 있습니다. 그래서 저는 매분이 함수를 호출합니다. 어떻게하면 더 효과적으로 최적화 할 수 있습니까?

function processData(jsonObject) { 
    maxmind.open('./GeoIP2-City.mmdb', function(err, locationLookup) { 
     if (err) { 
      logger.error('something went wrong on maxmind fetch', err); 
     } 
     for (var i = 0; i < jsonObject.length; i++) { ...} 
}) 
} 
+1

함수가 호출 될 때마다 파일을 열지 않는 것이 좋습니다. 한 번 열면 앱이 시작되고'locationLookup'을 전달합니다. – robertklep

+0

그건 좋은 소리. 변화를 만들어 지금 잘 작동합니다. 모든 도움과 피드백에 감사드립니다. 그것은 매우 도움이되었습니다. –

관련 문제