使用 NestJS 和 MongoDB 读取、解析文件和插入文档导致 JavaScript 堆内存不足
Reading, parsing files and inserting documents using NestJS and MongoDB causing JavaScript heap out of memory
我的 NestJS 应用程序有一个简单的目的:
- 遍历一组大文件(29 个文件,每个文件大约有 12k 到 70k 行)
- 逐行读取文件并解析
- 将(每一行)插入我的 MongoDB 集合
我的代码中最重要的部分包括:
for(let file of FILES){
result = await this.processFile(file);
resultInsert += result;
}
和函数 processFile()
async processFile(fileName: string): Promise<number> {
count = 0;
return new Promise((resolve, reject) => {
let s = fs
.createReadStream(BASE_PATH + fileName, {encoding: 'latin1'})
.pipe(es.split())
.pipe(
es
.mapSync(async (line: string) => {
count++;
console.log(line);
let line_splited = line.split("@");
let user = {
name: line_splited[0],
age: line_splited[1],
address: line_splited[2],
job: line_splited[3],
country: line_splited[4]
}
await this.userModel.updateOne(
user,
user,
{ upsert: true }
);
})
.on('end', () => {
resolve(count);
})
.on('error', err => {
reject(err);
})
);
});
}
主要问题出在第 9 个文件的交互作用下,我遇到内存故障:分配失败 - JavaScript 堆内存不足 。
我看到我的问题类似于 Parsing huge logfiles in Node.js - read in line-by-line 但代码仍然失败。
我怀疑我正在打开一个文件,读取它,当我打开另一个文件时,我仍然插入前一个文件可能会导致问题,但我不知道如何处理。
我可以通过更改 updateOne() to insertMany().
使其工作
快速解释:我们将按 100k 插入,而不是一个一个地插入。
所以我刚刚创建了一个用户数组,当它达到 100k 文档时,我们将插入 insertMany()
我的 NestJS 应用程序有一个简单的目的:
- 遍历一组大文件(29 个文件,每个文件大约有 12k 到 70k 行)
- 逐行读取文件并解析
- 将(每一行)插入我的 MongoDB 集合
我的代码中最重要的部分包括:
for(let file of FILES){
result = await this.processFile(file);
resultInsert += result;
}
和函数 processFile()
async processFile(fileName: string): Promise<number> {
count = 0;
return new Promise((resolve, reject) => {
let s = fs
.createReadStream(BASE_PATH + fileName, {encoding: 'latin1'})
.pipe(es.split())
.pipe(
es
.mapSync(async (line: string) => {
count++;
console.log(line);
let line_splited = line.split("@");
let user = {
name: line_splited[0],
age: line_splited[1],
address: line_splited[2],
job: line_splited[3],
country: line_splited[4]
}
await this.userModel.updateOne(
user,
user,
{ upsert: true }
);
})
.on('end', () => {
resolve(count);
})
.on('error', err => {
reject(err);
})
);
});
}
主要问题出在第 9 个文件的交互作用下,我遇到内存故障:分配失败 - JavaScript 堆内存不足 。 我看到我的问题类似于 Parsing huge logfiles in Node.js - read in line-by-line 但代码仍然失败。
我怀疑我正在打开一个文件,读取它,当我打开另一个文件时,我仍然插入前一个文件可能会导致问题,但我不知道如何处理。
我可以通过更改 updateOne() to insertMany().
使其工作
快速解释:我们将按 100k 插入,而不是一个一个地插入。
所以我刚刚创建了一个用户数组,当它达到 100k 文档时,我们将插入 insertMany()