스트리밍 데이터가 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
나는 당신이 무엇을 제안하는지 알고 있습니다. 다시이 문제는 나에게이 함수가 여러 번 호출된다는 것입니다. 매우 빠른 속도로 데이터 객체를 얻고 있습니다 (매분 데이터 스트림). 데이터 객체가 수신 될 때마다 IP를 포함하여 루프의 모든 필드를 구문 분석합니다. 즉, 파일이 다시 열릴 때마다 의미합니다. 파일을 사용하지 않고 maxmind를 쿼리하는 다른 방법이 있습니까? maxmind.openSync()는 데이터베이스 전체를 메모리로 읽습니다. 나는 나의 인스턴스에 100MB를 가지고 있지만, 문제는 내가 메모리를 증가시키는 pm2로 실행할 때이다. GC가 정리를 실행하는지 확실하지 않음 –
어떤 솔루션을 선택하든 한 번만 데이터베이스를 열거 나 읽어야합니다. 함수가 많이 호출되고 비동기 적으로 데이터베이스 파일을 열려면 함수 외부에서 열어야합니다. 최상의 솔루션이 무엇인지 응용 구조에 따라 다릅니다. – robertklep
확인. 고마워. 시험과 시험을 해봅시다. 메모리 등을 모니터하고 결과로 당신에게 돌아 가라. –