我使用IP地址传入数据流。我想在将数据放入我的数据库之前将IP翻译为经度和纬度。使用IP地址流式传输数据的node-maxmind用法
这就是我正在做的,但它造成了一些问题。我也尝试把forObject放在for循环之外。奇怪的是,它使用了大量的内存。我知道这是阻止代码,但它应该是快速的。虽然我看到内存问题,因为数据对象来自流连续不断,每个数据对象是巨大的。
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');外部循环引起内存的巨大增加。
另一种选择是使用非阻塞代码
maxmind.open('/path/to/GeoLite2-City.mmdb', (err, cityLookup) => {
var city = cityLookup.get('66.6.44.4');
});
但我不认为这是一个很好的DEA把这个循环中。
我该如何处理?我得到的数据对象的每一分钟
https://github.com/runk/node-maxmind
我明白你在暗示什么。对我来说这个问题是我有多次调用这个函数。我以非常高的速度获取数据对象(每分钟数据流)。每次接收到数据对象时,我都会解析循环中的所有字段,包括IP。这意味着每次都会打开该文件。有没有其他的方式来查询maxmind而不使用该文件? maxmind.openSync()会将整个数据库读入内存。我的实例有100mb,但问题是当我使用pm2运行它时,内存不断增加。不确定GC是否运行清理 –
无论您选择哪种解决方案,您都应该打开/读取数据库一次。如果该函数被调用了很多,并且想要异步打开该数据库文件,则应该在函数之外打开它。这取决于您的应用程序结构是什么最佳解决方案。 – robertklep
好的。非常感谢。让我做一些试验和测试。监视内存等,并回到你的结果 –