我们需要定期更新firebase中的大量数据(大约5百万个记录)。目前我们有几个json文件,大小约为1 GB。
由于现有的第三方解决方案(here和here)存在一些可靠性问题(每个对象导入对象;或需要开放连接),并且与Google云平台生态系统完全脱节。我想知道现在是否有一种“官方”方式,即新的谷歌云功能?或者与应用引擎 / 谷歌云存储 / 谷歌云数据存储区组合使用。
我真的不想处理身份验证 - 云功能似乎处理得很好,但我认为功能会超时(?)
答案 0 :(得分:4)
我终于发布了答案,因为它与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的jsons,进行简单的json转换。
当我们正在使用node.js流时,任何JSONStream库都可以有效地转换数据(JSONStream on npm),异步处理数据就像一个带有事件流的大型数组({{3 }})。
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,以防止内存泄漏阻塞整个函数。
如果您进行需要较长运行时间的较重转换,请使用" job db"在firebase中跟踪你所在的位置并且只进行100.000转换并再次调用该函数,或者设置一个附加函数来监听插入到" forimport db"最终将原始jsons对象记录异步转换为目标格式和生产系统。拆分导入和计算。
此外,您可以在nodejs app引擎中运行云功能代码。但不一定相反。