【问题标题】:What is the best approach to send huge chunks of data from Angular to Express via http?通过 http 将大量数据从 Angular 发送到 Express 的最佳方法是什么?
【发布时间】:2020-06-20 18:38:29
【问题描述】:

我有一个巨大的数据集,例如 200MB 的 txt 格式。 我能够通过 http 调用将数据发送到 Angular

现在我需要发回数据,在本地完成小编辑后,可以在每一“行”中完成(参见Reading an FASTA file,这是文件格式)。

令我惊讶的是,我不能把它寄回去,它太大了;我正在保存到 MongoDB。我注意到,如果我发送说 1%,它就可以了。所以,我现在的解决方案是以更小的数据块发送数据。尽管如此,我在这里尝试了一些建议的方法,但没有。

我在这里发现了一个类似的问题:Angular 7 Handling large post http request

我的问题是:为了接收数据,我们可以使用观察者;因此,数据是在小卡盘中接收的。 有没有一种明确的方法可以让它成为一种方法,或者我可以输入整个数据集并由它来完成其余工作的东西?

可能的提示:如果我能发送1%,我可以把它分成1%的块,然后依次发送;但我需要确保 Angular 在前一个调用完成之前不会发送 HTTP 调用,否则,由于 JavaScript 内存问题,快速应用程序会崩溃。

在此处查看此问题的第一个版本,一切从这里开始:How can I hold on http calls for a while?

我不确定这是否是一个未解决的问题,因为我没有提供代码。我还在学习使用这个平台;有时我们从鸡身上取了太多的金蛋!提前致谢! :)

讨论

@zzfs 明智地给了我一些见解,我会考虑的;尽管如此,我还是愿意将代码作为示例,示例;至少对我来说,从代码中学习更容易。

@zzfs 提到要考虑“差异”,并只保存更改,这是我目前的方法。我坚持开放这个赏金的原因是,如果可能的话,我想拥有一个健壮的系统,这意味着如果一个人添加过多的 cmets,差异将很小,系统可能会崩溃;我相信,发生这种情况的可能性很小,因为有些人不太可能一次性增加 1.000-10.000 cmets。

另一个问题是不知道我目前上传数据集的方式是否最好,我是从 Mongo 和 Express 中的应用上传,本地保存。

【问题讨论】:

    标签: angular express http


    【解决方案1】:

    仅在下载诸如 zip 之类的 blob 或将 blob 上传到服务器(想想 youtube 或 Dropbox 上传)等情况下,向客户端发送和从客户端发送如此大的文件才有意义。所有其他用例通常在没有如此大的转移的情况下处理......

    您提到您只会执行“小型编辑”。这意味着您应该只发送差异,而不是全部内容。你的问题太宽泛了,所以我不能给你一个更清晰的答案,但是当你的大文件是 JSON 或文本文件并且用户更改了其中的某些内容时,你可以很容易地标记该更改的位置并将其发送使用实际更改的有效负载。然后,您的服务器(运行 express 的节点?)应该能够进行差异检查并将更改应用于 200MB 文件。


    当然支持分块多个 HTTP 请求并且经常发生。当您真的想上传 200MB 的文件时,可以将其拆分并使用 switchMap 进行顺序上传或使用 forkJoin 进行并行请求。

    但是你仍然会在服务器上进行一些类型的后处理(在最简单的情况下组合块),所以你应该将注意力集中在实现 diff-checker 方法上如上所述。

    【讨论】:

    • 亲爱的@jzzfs,感谢您的回答,确实,我正在实施“差异”的方法,但是,如果有人编辑说大量数据,发送的数量将是巨大的。我正在使用具有基因序列的文件,然后有人可以对其发表评论。当没有评论时,没关系,我可以应用这种差异检查,这是我目前的方法,但我想考虑一个实际情况,其中编辑了大量数据(我担心系统可能会压垮那些案例使用)
    • 在这种情况下,我仍然有上述问题。此外,我不确定数据的来源,我可能需要从前面获取。
    • 我会考虑你说的
    • 我明白了。好吧,如果人们只对其发表评论,那很容易——只需保存评论,而不是整个文本——想想谷歌文档 cmets。如果你的文本文件是一个基因序列,你仍然可以以某种方式将它分成块。想想一个 jupyter 笔记本,其中文档很大,但您有要编辑的单个块...关于代码 - 我们不会编写您的代码,但可以在您共享时为您指明正确的方向你已经拥有的:)
    • 亲爱的@jzzfs,我真的很喜欢你发送cmets的想法,确实,它可以解决问题;我可以只发送添加的 cmets 及其各自的 ID。尽管如此,既然我们有时间,让我们暂时打开赏金,我有兴趣听听其他人的观点。最好的,
    猜你喜欢
    • 1970-01-01
    • 2021-03-04
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多