node-maxmind 用于使用 IP 地址流式传输数据
node-maxmind usage for streaming data with IP address
我有带 IP 地址的流数据。我想在将数据放入我的数据库之前将 IP 转换为经度和纬度。
这就是我所做的,但它导致了一些问题。我还尝试将 locationObject 放在 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');外部 fr 循环导致内存大量增加。
另一个选项是使用非阻塞代码
maxmind.open('/path/to/GeoLite2-City.mmdb', (err, cityLookup) => {
var city = cityLookup.get('66.6.44.4');
});
但我认为将其放入循环中并不是一个好主意。
我该如何处理?我每分钟都在获取数据对象
我不确定为什么你认为每次循环迭代读取数据库文件会很快("blocking code" 不等于 "fast code"),读取数据库要好得多文件一次然后循环 data
.
maxmind.openSync()
会把整个数据库读入内存,也就是README:
中提到的
Be careful with sync version! Since mmdb files are quite large
(city database is about 100Mb) fs.readFileSync
blocks whole
process while it reads file into buffer.
如果您没有空闲内存,唯一的选择是异步打开文件。同样,不是在循环内,而是在循环外:
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;
}
}
});
我唯一担心的是随着时间的推移我多次调用这个函数。每次我的消费者从 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++) { ...}
})
}
我有带 IP 地址的流数据。我想在将数据放入我的数据库之前将 IP 转换为经度和纬度。
这就是我所做的,但它导致了一些问题。我还尝试将 locationObject 放在 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');外部 fr 循环导致内存大量增加。
另一个选项是使用非阻塞代码
maxmind.open('/path/to/GeoLite2-City.mmdb', (err, cityLookup) => {
var city = cityLookup.get('66.6.44.4');
});
但我认为将其放入循环中并不是一个好主意。
我该如何处理?我每分钟都在获取数据对象
我不确定为什么你认为每次循环迭代读取数据库文件会很快("blocking code" 不等于 "fast code"),读取数据库要好得多文件一次然后循环 data
.
maxmind.openSync()
会把整个数据库读入内存,也就是README:
Be careful with sync version! Since mmdb files are quite large (city database is about 100Mb)
fs.readFileSync
blocks whole process while it reads file into buffer.
如果您没有空闲内存,唯一的选择是异步打开文件。同样,不是在循环内,而是在循环外:
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;
}
}
});
我唯一担心的是随着时间的推移我多次调用这个函数。每次我的消费者从 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++) { ...}
})
}