我有2个文件(两个文件都是> 1,000,000行):
第一个文件只包含一个md5哈希
第二个文件包含md5; emailadress
现在我必须比较这两个文件,如果md5哈希是相同的 - >将电子邮件地址写在一个单独的文件中。
我用mysql尝试并加入
SELECT `email` FROM `intern` INNER JOIN `extern` ON `intern`.`md5` = `extern`.`md5`
并读取2 csv并在2个循环中进行比较。的NodeJS:
fs.readFile('public/md5-data/reachadout.csv', (err, internFile) => {
fs.readFile('public/md5-data/customer.csv', (err, externFile) => {
var internLines = internFile.toString().split('\n');
var externLines = externFile.toString().split('\n');
internLines.forEach(function(iLine){
var internCells = iLine.split(';');
if(externLines.indexOf(internCells[0]) > -1){
fs.appendFileSync('public/md5-data/blacklist.csv', internCells[1] + '\n');
}
})
})
})
两种方式都很慢。还有其他算法或解决方案吗?
答案 0 :(得分:2)
而是创建一个查找对象,您可以在其中查找散列是否在externFile中 我修改了你的代码来做到这一点
fs.readFile('public/md5-data/reachadout.csv', (err, internFile) => {
fs.readFile('public/md5-data/customer.csv', (err, externFile) => {
var internLines = internFile.toString().split('\n');
var externLines = externFile.toString().split('\n');
var externLookup = {}; //Added line
externLines.forEach(function (eLine){ //Added line
externLookup[eLine] = true; //Added line
}); //Added line
internLines.forEach(function(iLine){
var internCells = iLine.split(';');
if(externLookup[internCells[0]]){ //Changed line
fs.appendFileSync('public/md5-data/blacklist.csv', internCells[1] + '\n');
}
})
})
})
您的代码最大的问题是,对于" InternFile"中的每一行,它必须检查externfile中的每一行并查看是否存在匹配。如果你像我一样创建一个对象,那么查询一个对象是否存在就会更快
编辑:或者,你可以像使用SQL一样使用SQL,但是你必须在hash_column中添加一个INDEX。