有没有一种方法可以在不消耗JS堆内存的情况下插入大量数据?我有一个电子邮件模型,如下所示:
@Entity("email")
export class Email extends BaseEntity {
@PrimaryGeneratedColumn()
public id: number;
@ManyToOne((type) => Category, (cat) => cat.category, {nullable: false, cascade: ['insert']})
public category: Category;
@Column({type: "text", name: "email"})
public email: string;
}
和类别:
@Entity("category")
export class Category extends BaseEntity {
@PrimaryGeneratedColumn()
public id: number;
@Column({type: "text", name: "category"})
public category: string;
@OneToMany((type) => Email, (email) => email.category, {nullable: true})
public emails: Email[];
}
我遇到的第一个问题是,当我尝试保存{email: 'blabal@blalbah.com', category: 'default'}
时说类别必须是一个ID,但问题是我想添加电子邮件并创建类别(如果该类别不存在)或将该ID分配给电子邮件(如果存在)。我做了以下代码:
public async bulkCreate(emails: Email[]): Promise<any> {
try {
const emailRepo = await getRepository(Email);
const categoryRepo = await getRepository(Category);
await Promise.all(emails.map(async (mail) => {
const cat = await categoryRepo.findOne({where: {category: mail.category}});
if (cat) {
// @ts-ignore
mail.category = cat.id;
} else {
const newCat = await categoryRepo.save(Object.assign(new Category(), mail));
// @ts-ignore
mail.category = newCat.id;
}
await emailRepo.save(mail);
}));
} catch (e) {
console.log(e);
throw new Error(e);
}
}
工作了几封电子邮件,但是当我尝试添加时,像Like 4Gig一样,只有1,000个内存才崩溃。
我该怎么办?我想一次添加1000多封电子邮件。