我们的情况是,我们必须定期更新 firebase 中的大量数据(大约 5 个 Mio 记录)。目前我们有一些大小约为 1 GB 的 json 文件。
由于现有的第三方解决方案( here 和 here )存在一些可靠性问题(每个对象导入对象;或需要开放连接)并且与谷歌云平台生态系统完全脱节。我想知道现在是否有“官方”使用方式,即新的谷歌云功能?或者与应用引擎/谷歌云存储/谷歌云数据存储的组合。
我真的不喜欢处理身份验证 - 云功能似乎处理得很好,但我认为该功能会超时(?)
使用新的 firebase 工具,如何:
最佳答案
我终于发布了答案,因为它与 2017 年新的 Google Cloud Platform 工具保持一致。
新推出的 Google Cloud Functions 的运行时间有限,约为 9 分钟 ( 540 seconds )。但是,云函数能够像这样从云存储创建 node.js 读取流( @googlecloud/storage on npm )
var gcs = require('@google-cloud/storage')({
// You don't need extra authentication when running the function
// online in the same project
projectId: 'grape-spaceship-123',
keyFilename: '/path/to/keyfile.json'
});
// Reference an existing bucket.
var bucket = gcs.bucket('json-upload-bucket');
var remoteReadStream = bucket.file('superlarge.json').createReadStream();
即使它是远程流,它也是非常高效的。在测试中,我能够在 4 分钟内解析大于 3 GB 的 json,进行简单的 json 转换。
当我们现在使用 node.js 流时,任何 JSONStream 库都可以有效地动态转换数据 ( JSONStream on npm ),异步处理数据,就像具有事件流 ( event-stream on npm ) 的大型数组一样。
es = require('event-stream')
remoteReadStream.pipe(JSONStream.parse('objects.*'))
.pipe(es.map(function (data, callback(err, data)) {
console.error(data)
// Insert Data into Firebase.
callback(null, data) // ! Return data if you want to make further transformations.
}))
在管道末端的回调中仅返回 null 以防止内存泄漏阻塞整个函数。
如果您执行需要更长运行时间的更重的转换,请使用 firebase 中的“作业数据库”来跟踪您所在的位置,并且只执行 100.000 次转换并再次调用该函数,或者设置一个附加函数来监听插入一个“forimport db”,它最终将原始 jsons 对象记录异步转换为您的目标格式和生产系统。拆分导入和计算。
此外,您可以在 nodejs 应用引擎中运行云函数代码。但不一定反过来。
关于firebase - 定期将大数据 (json) 导入 Firebase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44398442/