首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从CSV文件中提取文件的后端解决方案

从CSV文件中提取文件的后端解决方案
EN

Software Engineering用户
提问于 2020-08-09 19:43:59
回答 3查看 1.5K关注 0票数 2

我正在构建一个数据可视化,显示美国、城市、州和县的COVID信息。

真相的最终来源是“纽约时报”在“回购:https://github.com/nytimes/covid-19-data”中发表的三个CSV。

CSV每天更新一次,使用前一天的新数据。

前端包括选择州、县和统计类型(死亡人数、病例数等)。然后显示三条线图,显示随时间变化的速度--在国家、州和县一级。

现在,该应用程序纯粹是前端。它下载三个CSV的集合(相当大),然后对数据进行一系列计算,当承诺完成后,可视化最终显示在浏览器中。一个良好的互联网连接需要5-10秒才能完成--这在生产上很难持续,而且还要求用户下载全部数据,即使他们可能只是在寻找几个州/县的组合。

有没有一种解决方案可以加快速度,而不需要后端呢?还是需要一个正式的数据库/后端结构?

以下是我对后端解决方案(我将使用Node.js / Express REST设置)的总体想法,但希望得到一些建议:

  1. 部署一个Node.js脚本,每天下载一次CSV并将数据放入数据库。我可以下载整个CSV并重写整个数据库,或者只下载新的数据并将其添加到数据库中。
  2. 对数据执行一些额外的计算(例如,计算前一天的更改),然后将这些数据发送到数据库。这些额外的计算也可以由客户端完成(这就是目前在我的前端解决方案中的工作方式)。
  3. 当用户加载页面时,从后端对州和县的列表进行前端查询,这样前端就可以加载。
  4. 当用户选择州/县组合时,只需通过REST将该信息发送到后端。让后端查询数据库,并只将请求的信息返回到前端。

杂项关切:

显然,最好采用无后端解决方案,但我想不出一种方法,在不首先下载完整的CSV的情况下,只使用用户提供的信息来查询这些CSV。

从数据库的角度来看,删除所有数据并完全重写它是一个很大的提升/成本?或者仅仅添加新数据会更符合成本效益(假设这是一种基于云的解决方案)吗?(假设旧数据不变,这是一种假设)

c.我一直把GraphQL作为休息的替代方案,但我不确定它是否能解决下载整个CSV并将它们“存储”到某个地方的问题。已经有几个在线开放源码API提供了一种更方便的查询数据的方法:

https://github.com/Li357/covid-nyt-api https://github.com/desholmes/covid-19-us-api

但这些似乎都是从CSV撤出,他们需要很长的时间。这是因为他们从CSV访问数据而不是数据库,我假设数据库访问速度要快得多吗?

EN

回答 3

Software Engineering用户

发布于 2020-08-10 05:22:51

为了允许对此类数据进行各种查询,这些查询仅通过网络传输所请求的比特和字节数量,为此需要对数据进行预处理和优化,这是无法避免的。这正是创建数据库的目的。试图通过“避免数据库”来使事情变得更简单,最终会建立一个独立的数据库,所以重新发明轮子。

是否有一种解决方案可以在不需要后端的情况下加快速度?

理论上,我们可以建立一个对等解决方案,其中数据库构建在一个客户端上,并在其他客户端上重用,但这肯定不是简单的,也可能不是您想要的。所以最好选择最简单、最直接的解决方案,即使用数据库后端。如果您有速度问题,请使用具有内存中功能的数据库,如SQLite。

但是,如果您没有后端,也没有预处理数据,只有"GitHub“作为”穷人的后端“,那么就没有办法首先将所有的CSV数据拖到浏览器上。正如你所写的,这并不能给你一个令人满意的体验。

从数据库的角度来看,删除所有数据并完全重写它是一个很大的提升/成本吗?或者仅仅添加新数据会更符合成本效益(假设这是一种基于云的解决方案)吗?

这最终取决于新旧数据的数量,以及数据的比率,但不要忘记,数据每天只更新一次,而且可能有大量的时间对其进行预处理(=将其存储在数据库中)。所以,选择你能想到的最简单的解决方案,然后当你注意到它变得太慢时,再对它进行优化。别想太多了。

我一直在看GraphQL

GraphQL是查询数据的更丰富的方法。它并没有改变以前的任何考虑。

票数 4
EN

Software Engineering用户

发布于 2020-08-10 05:44:58

只需将其保存在内存中

即使是完整的县级CSV数据也相对较小(16 MByte),因此可以在没有数据库的情况下将其完全缓存在后端内存中,并在内存中保持状态和县的简单索引。数据可以保存为原始CSV文件行的副本,因此后端可以以前端当前准备处理的格式交付它。

内存中的数据可以由CSV文件的本地文件系统副本支持,以避免重复查询源,并且可以通过某些预定的下载过程刷新,该过程使用If-修改--因为HTTP报头只能在新数据可用时才下载。这可能已经在一些缓存库中可用了。

极小API

后端可以提供非常小的API:

  • 一个端点请求数据,使用州和县的查询参数(如果应用程序需要的话,可能还有日期范围),它将交付选定的数据子集。
  • 一个端点请求可用的州/县名称列表。

最小前端更改

要获得县的列表并使用查询参数访问数据,前端将需要最少的更改。所有数据处理都可以不修改。

票数 1
EN

Software Engineering用户

发布于 2020-08-10 20:44:51

因为真相的来源是git,所以如果您只需将数据库复制到您的web服务器上,就可以放弃使用数据库。然后,让您的后端只需阅读本地副本,而不是每次请求它从Github。这也使得保持数据同步变得更容易,因为您只需要偶尔做一次执行git pull的cron任务。

如果您不想/不能在您的web服务器上安装git,您可以使用类似于git-ftp的东西来保持它的同步。

注意:我没有使用git-ftp,这只是我在快速搜索中发现的第一件事。也许有更好的方法可以做到这一点。

一个更困难的解决方案是在github上创建您自己的git,下载csv文件,将它按县划分,然后用data-by-county/us-counties-Alabama-Autauga.csv这样的名称上传到您的回购中。然后,前端代码可以只检索用户感兴趣的县的数据。不需要后端。只需确保每天运行一次流程或其他什么。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/414652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档