gpt4 book ai didi

javascript - 使用 Admin SDK 批量写入 Firestore

转载 作者:行者123 更新时间:2023-11-30 11:17:31 26 4
gpt4 key购买 nike

我有一个非常大的 ASCII 平面文件(150 万行)需要从中读取。它基本上是制造商的零件 list 。我想使用 Firestore 来托管它。

作为 .csv 文件,它的大小为 250GB。我能够使用 Windows PowerShell 将它转换为 JSON 文件,现在它的重量超过 1GB。

如何将该数据导入 Firestore?我认为 Admin SDK 和批量写入是可行的方法。因此,我完成了所有设置并组装了一个 Node 脚本,但 Firestore 的 Admin SDK 文档很薄。

我的 Node 脚本在下面,但它抛出错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory

var admin = require("firebase-admin");
var serviceAccount = require("./--------------------------.json");
var fs = require('fs');
var myCsvFile = "./global.csv"
var parse = require('csv-parse');
require('should');

admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://g--------b.firebaseio.com"
});

var firestore = admin.firestore();
var writeBatch = firestore.batch();
var myRef = firestore.collection("foo").doc();
var obj = {};


fs.createReadStream(myCsvFile)
.pipe(parse({delimiter: '|',relax_column_count:true,quote: ''}))
.on('data', function(csvrow) {
if(csvrow[1]){
obj.family = csvrow[1];
}
if(csvrow[2]){
obj.series = csvrow[2];
}
if(csvrow[3]){
obj.sku = csvrow[3];
}
if(csvrow[5]){
obj.description = csvrow[5];
}
if(csvrow[7]){
obj.price = csvrow[7];
}
writeBatch.set(myRef, obj);
})
.on('end',function() {
writeBatch.commit()
});

最佳答案

每秒可以写入 500 个条目。因此,关键是将 .commit 的速率限制为每秒 1 次,并将 batch.set 的每次提交限制在 500 次以下。我使用 aynch/await 作为速率限制器以及 promise.all 样式模式将 .set 推送到 .batch 的递增数组中是的。

哦,还有最后一件事 - 我不得不通过 --max-old-space-size 开关告诉 Node 使用更多内存。

以下脚本复制自 High Tech Telecom :

var admin = require("firebase-admin");
var serviceAccount = require("./your-firebase-project-service-account-key.json");
var fs = require('fs');
var csvFile = "./my-huge-file.csv"
var parse = require('csv-parse');
require('should');

admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://your-project.firebaseio.com"
});

var firestore = admin.firestore();
var thisRef;
var obj = {};
var counter = 0;
var commitCounter = 0;
var batches = [];
batches[commitCounter] = firestore.batch();

fs.createReadStream(csvFile)
.pipe(
parse({delimiter: '|',relax_column_count:true,quote: ''})
)
.on('data', function(csvrow) {
if(counter <= 498){
if(csvrow[1]){
obj.family = csvrow[1];
}
if(csvrow[2]){
obj.series = csvrow[2];
}
if(csvrow[3]){
obj.sku = csvrow[3];
}
if(csvrow[4]){
obj.description = csvrow[4];
}
if(csvrow[6]){
obj.price = csvrow[6];
}
thisRef = firestore.collection("your-collection-name").doc();
batches[commitCounter].set(thisRef, obj);
counter = counter + 1;
} else {
counter = 0;
commitCounter = commitCounter + 1;
batches[commitCounter] = firestore.batch();
}
})
.on('end',function() {
writeToDb(batches);
});

function oneSecond() {
return new Promise(resolve => {
setTimeout(() => {
resolve('resolved');
}, 1010);
});
}

async function writeToDb(arr) {
console.log("beginning write");
for (var i = 0; i < arr.length; i++) {
await oneSecond();
arr[i].commit().then(function () {
console.log("wrote batch " + i);
});
}
console.log("done.");
}

关于javascript - 使用 Admin SDK 批量写入 Firestore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51012014/

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