json - 将大量数据集从 JSON 导入 Cloud Firestrore
问题描述
我正在尝试将一个大型 JSON 文件(177k 记录)导入云存储,首先我找到了下面的代码;
上传代码
var admin = require("firebase-admin");
var serviceAccount = require("./service_key.json");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "my service key"
});
const firestore = admin.firestore();
const path = require("path");
const fs = require("fs");
const directoryPath = path.join(__dirname, "files");
fs.readdir(directoryPath, function(err, files) {
if (err) {
return console.log("Unable to scan directory: " + err);
}
files.forEach(function(file) {
var lastDotIndex = file.lastIndexOf(".");
var menu = require("./files/" + file);
menu.forEach(function(obj) {
firestore
.collection('academicians2')
.add({ 'department': obj['department'], 'designation': obj['designation'], 'field': obj['field'], 'name': obj['name'], 'university': obj['university'], 'reviewList': [], 'rating': 0 })
.then(function(docRef) {
console.log("Document written");
})
.catch(function(error) {
console.error("Error adding document: ", error);
});
});
});
});
但是在上传 10-15k 记录后开始出错,(我猜是内存错误),所以我决定每隔 1.2 秒安排一次云函数超时并将这个 JSON 批量写入 firestore,但真的不知道如何获得 499 行对于我的 JSON 的每次运行。
定时云功能
/* eslint-disable */
const functions = require("firebase-functions");
const admin = require('firebase-admin');
const { user } = require("firebase-functions/lib/providers/auth");
admin.initializeApp();
const firestore = admin.firestore();
const userRef = admin.firestore().collection('academicians2');
exports.scheduledFunction = functions.pubsub.schedule('every 1.2 seconds').onRun((context) => {
//do i need to create for loop for batch or how can i approach to solve this problem
});
解决方案
我会做这样的事情:
使用“start after”子句使计划函数一次获取 500 条记录。
对数据库执行批量写入(您可能知道,批量写入限制为 500)
如果成功,将这 500 条记录的最后一条记录(或对最后一条记录的引用:例如:记录的 ID)复制到数据库中的文档中。它可以是一个名为“upload_tracker”的文档,其中包含一个名为“last_uploaded”的字段。
在后续操作中:该函数
last_uploaded
从您的数据库中查询记录,然后在最后一条记录之后执行另一个操作。
笔记:
. 如果您想快速完成,预定函数可以在终止之前写入多个批处理。
. 在您的 Google Cloud Console / Cloud Functions 中,如果您知道它会运行很长时间,您可能希望将函数的超时值延长到 9 分钟。
. 文件 ID 应反映您的“记录 ID”(如果有),以确保没有重复。
推荐阅读
- java - FilterInputStream IS-A InputStream 和 HAS-A InputStream
- javascript - 实现多语言时的 SASS Mixin 排版问题
- python - 目标是列表时的Pygame设置音量
- python-3.x - tkinter 中的格式化文本
- java - 检查传感器是否存在并且是否正常工作的可靠方法是什么?
- reactjs - 无法添加属性键,对象不可扩展错误 Apollo Client with antd
- android - 当应用程序在后台时如何显示来电?安卓
- javascript - 如何以角度从firebase中的实时数据库接收数据
- python - 在elasticsearch-py中索引特殊的JSON文件?
- c++ - 使用 vector::reserve 或 vector::resize 时发生了什么