如何处理和下载非常大的文件?

时间:2018-10-21 18:01:51

标签: c# asp.net-web-api browser signalr task-queue

我想知道采用哪种方法

问题流:

  • 我有一个Web API,可以接受来自客户端的请求
  • API层先与业务层对话,然后再与数据层对话
  • 数据层获取巨大的记录集(5000000行),现在是业务层  处理列和行(使用处理器的最大线程数)
  • 处理完API后,将内容作为excel / csv流式传输到客户端(浏览器)

现在,整个下载过程只有一个流程(触发并等待响应准备就绪)

我想将处理5000000行的庞大业务操作隔离到单独的引擎或任务队列中(我不想让我的网站陷入内存不足的异常),我也想使用户体验光滑。

尝试使用服务器推送事件/信号/或浏览器长时间轮询,以便一旦处理完数据/文件后就可以推送文件。

有没有更好的方法来实现相同目标?

1 个答案:

答案 0 :(得分:0)

根据我的理解,这里有一些建议

  1. 序列化。我不建议以CSV或Excel格式回复如此大的数据集,除非它是客户端可以处理的唯一格式。如果您对工作流程有一定的控制权,那么我将更改客户端以接受JSON之类的格式,或者更好地使用更加优化的数据和速度高效的序列化程序,例如ProtoBuff,Avro,Thrift等。
  2. 分页。(假设您能够实现上述建议。)通常,以大数据进行响应会阻碍整体性能。 API接受参数来定义页码和页面大小是很常见的。就您而言,您可以为查询创建一个唯一的参考ID(例如“ query-001”,可以在/api/query/001?page=10&items-per-page=10000上调用)。
  3. 缓存。。如果查询频繁进行,为了减少每次查询对数据层的影响(例如,请求不同的页面)。您可以将数据加载到磁盘上,也可以将数据保留在内存中。保留高速缓存将大大提高性能,还可以减少涉及系统性能调整的复杂调试问题。