Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript electron:如何在处理大量数据时提高性能并防止崩溃_Javascript_Performance_Google Chrome_Electron - Fatal编程技术网

javascript electron:如何在处理大量数据时提高性能并防止崩溃

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

在我的应用程序中,当我想要处理数据时,有一个阈值超过这个阈值,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++)
 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