javascript electron:如何在处理大量数据时提高性能并防止崩溃
在我的应用程序中,当我想要处理数据时,有一个阈值超过这个阈值,chrome(electron)就无法处理并崩溃。从RAM和CPU来看,这种情况不应该发生(CPU和内存低于60%),但数据量足够大(对500Mb文件进行数据解析),因此它是有意义的 但还是有办法解决这个问题吗?例如,我试图改变javascript electron:如何在处理大量数据时提高性能并防止崩溃,javascript,performance,google-chrome,electron,Javascript,Performance,Google Chrome,Electron,在我的应用程序中,当我想要处理数据时,有一个阈值超过这个阈值,chrome(electron)就无法处理并崩溃。从RAM和CPU来看,这种情况不应该发生(CPU和内存低于60%),但数据量足够大(对500Mb文件进行数据解析),因此它是有意义的 但还是有办法解决这个问题吗?例如,我试图改变 let lines = file.split("\n"); // lines is an array of 500,000 for (let i=0; i<lines.length; i++) par
let lines = file.split("\n");
// lines is an array of 500,000
for (let i=0; i<lines.length; i++)
parse(lines[i]);
let line=file.split(“\n”);
//行是一个500000行的数组
对于(让i=0;i我认为您遇到的问题是代码将整个文件读取到内存中。相反,将文件中的行流式传输应该会提高性能
我尝试并评估了多个模块(,)来处理newline的读取。readline
在这三个模块中性能最好,所以我将演示这一点
下面是一个示例,我从一个文件中读取数据,将每行大写,然后将结果写入另一个文件。如果您不关心解析后使用数据,只需忽略所有rs
代码即可
const fs = require('fs')
const readline = require('readline')
const stream = require('stream')
const lineReader = readline.createInterface({
input: fs.createReadStream('dummy.txt')
})
const rs = new stream.Readable
rs._read = function () {}
rs.pipe(fs.createWriteStream('transformed.txt'))
lineReader.on('line', function (line) {
rs.push(parse(line))
})
lineReader.on('close', function () {
// when all lines have been read
// this signals that the stream has ended
rs.push(null)
})
function parse(chunk) {
return chunk.toUpperCase()
}
我已经解决了大量行循环的问题,只需删除已经读取的行
就我而言,这仅仅是通过这样做
for (let i=0; i<lines.length; i++)
pieces = lines[i].split("\t");
lines[i] = ''; // <- here
用于(让i=0;iIs您的javascript在electron外壳外运行正常吗?我有一个运行的electron应用程序,它保存了一个大文档,但没有您的文档那么大。但它确实没有问题。请尝试更具体地说明您试图完成的数据类型或进程类型。它是文本数据,所有内容都在electron外壳内,我想必须在行中拆分,然后在选项卡中拆分每一行,然后将数据组织到一个对象中以供以后处理。文件大小取决于每个用户,并且是实验性生成的。您是否尝试使用流?这不仅仅是传递数据。使用第一种方法,您将强制节点在内存中处理整个文件。您的第二个应用程序roach异步处理这个问题的方向是正确的,但是为每一行创建承诺会给GC带来更大的压力,并且for循环仍然是同步的。您要做的是将文件作为一个流读取,也许可以找到一个模块,将流拆分成新行,然后使用解析函数映射/转换每个块我的假设通过让节点流化数据而不是for循环,它应该在必要时自动“呼吸”,并将减少GC压力,因为您永远不会在任何时候将整个文件存储在内存中谢谢!我将看看这是否有帮助。但在此之前,我怀疑当对象开始太大,最后崩溃了,而不是处理太多的行。但我可能错了,我希望用你的答案来检查:)我添加了一个自我回答,因为我找到了一种非常简单的方法来提高解析。但是,我无法防止在处理非常大的数据结构时Chrome崩溃。也许我应该存储部分数据,并在需要时动态加载它们。但无论如何,我不能使用您的建议,但谢谢,因为我不知道这些模块:)
for (let i=0; i<lines.length; i++)
pieces = lines[i].split("\t");
lines[i] = ''; // <- here