定期将大数据(json)导入Firebase

定期将大数据(json)导入Firebase,firebase,architecture,firebase-realtime-database,google-cloud-datastore,google-cloud-functions,Firebase,Architecture,Firebase Realtime Database,Google Cloud Datastore,Google Cloud Functions,我们的情况是,我们必须定期更新firebase中的大量数据(约500万条记录)。目前,我们有一些json文件,大小约为1 GB 因为现有的第三方解决方案(和)存在一些可靠性问题(每个对象导入对象;或者需要开放连接),并且与google云平台生态系统的连接非常中断。我想知道现在是否有一种“官方”的方式使用新的谷歌云功能?或者与应用程序引擎/谷歌云存储/谷歌云数据存储相结合 我真的不喜欢处理身份验证——云函数似乎处理得很好,但我认为函数会超时(?) 有了新的firebase工具,如何: 是否有长期运

我们的情况是,我们必须定期更新firebase中的大量数据(约500万条记录)。目前,我们有一些json文件,大小约为1 GB

因为现有的第三方解决方案(和)存在一些可靠性问题(每个对象导入对象;或者需要开放连接),并且与google云平台生态系统的连接非常中断。我想知道现在是否有一种“官方”的方式使用新的谷歌云功能?或者与应用程序引擎/谷歌云存储/谷歌云数据存储相结合

我真的不喜欢处理身份验证——云函数似乎处理得很好,但我认为函数会超时(?)

有了新的firebase工具,如何:
  • 是否有长期运行的云函数来执行数据获取/插入?(这有意义吗?)
  • 从google云平台内部的某个地方获取json文件
  • 首先将大型数据放入google云数据存储(即存储在firebase中太贵了$$$),或者firebase实时数据库是否可以可靠地作为大型数据存储

  • 我最后发布了答案,因为它与2017年新的谷歌云平台工具保持一致

    新推出的Google云功能的运行时间有限,大约为9分钟()。但是,云函数能够从云存储中创建node.js读取流,如下所示()

    var gcs=require(“@google cloud/storage”)({
    //运行函数时不需要额外的身份验证
    //在同一项目中联机
    投影:“葡萄-123号宇宙飞船”,
    keyFilename:“/path/to/keyfile.json”
    });
    //引用现有的bucket。
    var bucket=gcs.bucket('json-upload-bucket');
    var remoteReadStream=bucket.file('superlarge.json').createReadStream();
    
    即使它是一个远程流,它也是高效的。在测试中,我能够在4分钟内解析大于3GB的json,并进行简单的json转换

    当我们现在使用node.js streams时,任何JSONStream库都可以有效地动态转换数据(),异步处理数据,就像处理带有事件流()的大型数组一样

    es=require('event-stream')
    remoteReadStream.pipe(JSONStream.parse('objects.*'))
    .pipe(es.map(函数(数据、回调(错误、数据)){
    控制台错误(数据)
    //将数据插入Firebase。
    回调(null,data)/!如果要进行进一步转换,请返回数据。
    }))
    
    在管道末端的回调中仅返回null,以防止内存泄漏阻塞整个函数

    如果您执行需要较长运行时间的较重转换,请在firebase中使用“作业数据库”跟踪您的位置,仅执行100.000次转换并再次调用该函数,或者设置一个附加函数,侦听“forimport db”中的插入最终将原始jsons对象记录异步转换为目标格式和生产系统。拆分导入和计算


    此外,您可以在nodejs应用程序引擎中运行云函数代码。但不一定相反。

    我没有处理过导入大型JSON文件的问题,但我可以谈论使用云函数处理数百万条数据库记录。我递归处理,获取100条记录。处理它们,保存数据库中的最后一个键。从该键启动下一个云函数,然后重复,直到处理完所有1000000条记录。这允许我将云函数的执行时间限制在更短的范围内。@我假设您有一个额外的“worker db”来跟踪正在发生的事情(?)。您是否介意分享云函数在该方法中迭代超过1百万条记录所需的时间,以及操作的功能和记录的大小/深度?这将有助于我评估我的架构;很难说需要多长时间,因为这取决于你的物体有多深,以及你对每一件物品的处理方式。您可以播放100张唱片,并将其放大/缩小,以优化您的请求时间。n00b问题。。。我所要做的就是将整个大型json对象从文件读入内存中的javascript对象。。。不需要任何特殊的过滤、解析或事件流。。。我该怎么做呢?即使我的json文件只有82MB,我的读取流也需要花费亿万年的时间才能完成。这怎么可能呢?我正在尝试读取512MBS GCS文件流并将其插入到Bigquery中,但这会导致我内存不足的问题。你能解释一下你处理3gb文件的方法吗?听起来你的代码有内存泄漏。也就是说,3GB的大文件是.json(主要是地理数据)。正如在回答中所写的,我使用了一个流库,该流库可以处理大文件块的json。因此,整个文件从未在函数过程中出现过。我认为您的崩溃是因为您试图将512MB加载到functions mode.js进程中,或者以妨碍js garbe收集器释放内存的方式处理它(内存泄漏)。您需要确保只使用流,所以流非常简单,我有大约512MBXML(70k条记录),在对象中转换,在100-200行的bigquery中插入流。你认为整个工作可以在谷歌云功能中完成吗?