Javascript 解析Node.js中的巨大文件速度更快,逐行读取文件,当前运行速度太慢
我有一个非常大的文本文件,有超过1500万条记录。它是一个词汇表文件,在左边显示单词,在右边显示单词的出现。我寻找的最终结果是过滤掉所有这些单词,任何出现次数少于200次的单词都被归类为困难单词 例如,这是文本文件的内部内容:Javascript 解析Node.js中的巨大文件速度更快,逐行读取文件,当前运行速度太慢,javascript,node.js,Javascript,Node.js,我有一个非常大的文本文件,有超过1500万条记录。它是一个词汇表文件,在左边显示单词,在右边显示单词的出现。我寻找的最终结果是过滤掉所有这些单词,任何出现次数少于200次的单词都被归类为困难单词 例如,这是文本文件的内部内容: of 12765289150 and 12522922536 左侧的单词和右侧的引用由制表符分隔 目前,我所在的系统返回出现的单词{ 常量fs=require('fs'), es=需要(‘事件流’), 路径=要求(“路径”), filePath=path.join(u
of 12765289150
and 12522922536
左侧的单词和右侧的引用由制表符分隔
目前,我所在的系统返回出现的单词{
常量fs=require('fs'),
es=需要(‘事件流’),
路径=要求(“路径”),
filePath=path.join(uu dirname,“../documents/vocab_cs”);
const-frequentwords=[];
设s=fs.createReadStream(文件路径)
.pipe(es.split())
.pipe(es.mapSync((行)=>{
常量行=行分割('\t');
常数频率=数量(行[1]);
如果(频率){
log('读取文件时出错',err);
})
.on('end',()=>{
unfrequentwordsstring=unfrequentwords.join(“”);
res.status(200).json(罕见的两个rdsstring);
console.log('读取整个文件')
})
);
}
任何建议都将不胜感激,因为我在这个领域没有太多的经验,我完全被困在这个问题上
只需要整个过程运行得更快,并返回给我这些罕见的单词
它必须是一个文本文件吗?文件更新了吗?如果是的话,多久更新一次?不,文件没有更新。只要扫描这些值,它可以是任何东西。@creynders如果它没有更新,我只需将相关值存储到一个单独的文本文件中即可使用它。或者更好的是,将它们存储在JS数组中。优化很难,99.99%的时候你需要使用几种技术。这都是非常上下文和用例特定的。无论如何,我要尝试的第一件事是内存中的数据存储,并运行基准测试,测试它的速度有多快以及是否值得。例如,redis:For I根据使用情况,它可能涉及所有这些组合:平面文件结构、数据库、内存缓存层、故障快速的bloom筛选器实现和用于进一步查找的levenshtein算法实现。但通常它还涉及各种UI技巧,以给人以速度的印象(这比实际速度更重要)。例如,屏幕锁定1秒似乎比请求加载-响应可视化1.5秒要长
exports.readText = (req, res, next) => {
const fs = require('fs'),
es = require('event-stream'),
path = require("path"),
filePath = path.join(__dirname, "../documents/vocab_cs");
const infrequentWords = [];
let s = fs.createReadStream(filePath)
.pipe(es.split())
.pipe(es.mapSync((line) => {
const lines = line.split('\t');
const freq = Number(lines[1]);
if (freq <= 200) {
infrequentWords.push(lines[0]);
}
// pause the readstream
s.pause();
// process line here and call s.resume() when rdy
// resume the readstream, possibly from a callback
s.resume();
})
.on('error', (err) => {
console.log('Error while reading file.', err);
})
.on('end', () => {
infrequentWordsString = infrequentWords.join(' ');
res.status(200).json(infrequentWordsString);
console.log('Read entire file.')
})
);
}