gpt4 book ai didi

javascript - Node/Express 解析 7000 个 xml 文档时发生 fatal error

转载 作者:行者123 更新时间:2023-12-02 22:27:40 26 4
gpt4 key购买 nike

我的服务器下载一个文本文件(大约 800 mb),它实际上是相互附加的 XML 字符串。将此字符串拆分为有效 XML 字符串数组后,我循环遍历该数组并使用库将其转换为 JSON,然后获取相关数据并将其添加到我的数据库中。

问题是,大约有 7000 个 XML 字符串(索引),我的应用程序出现以下消息错误:

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory

我尝试增加 package.json 文件中的 --max_old_space_size=4096 。这改善了它,在第 6000 个索引处失败。然后我尝试将其加倍到 8192,但也失败了。

有人知道这个问题的解决方案吗?

<小时/>

其他信息

我需要这些数据的原因:

我的应用程序包括可以创建文本搜索条件的用户。服务器每周下载一次该文件,并根据用户的搜索条件,发送一封电子邮件,其中包含符合这些搜索条件的文档。

我需要将这些文档加载到数据库中吗?无论如何,我计划在电子邮件发送后清理 table 。我选择以这种方式尝试,因为我认为利用内部联接等会比在普通 js 中完成所有操作更快。

最佳答案

除了一般内存使用之外,还有其他限制。具体来说,对象大小有限制。

我建议使用流来避免将整个文件加载到内存中。你如何下载该文件?例如,您可以将 wget 进程通过管道传输到 transform stream 。您可以为转换流实现 _transform 方法并让它执行以下“分割”。

After splitting this string into an array of valid XML strings

然后您可以解析 XML 数据或使用其他 Transform 或 Writable 流。

代码:

const { Transform } = require('stream');

const parseXMLString = new Transform({
transform(chunk, encoding, callback) {
const xml_parts = ...// Identify XML
// Other operations
callback(null, parsed_chunk);
}
});

const wget = require('child_process').spawn('wget', ['-qO-', myfileurl]);
wget.stdout.pipe(parseXMLString).pipe(...); // Pipe into writable stream

或者您可以在本地获取文件:

const file_stream = require('fs').createReadStream(filename);
file_stream.pipe(parseXMLString);

或者如果它是压缩的:

const unzip = require('child_process').spawn('unzip', ['-c', filename]);
unzip.stdout.pipe(parseXMLString);

关于javascript - Node/Express 解析 7000 个 xml 文档时发生 fatal error ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59012109/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com