将巨大的动态数据导出到csv。 csv的百万条记录

时间:2014-11-12 06:29:50

标签: c# entity-framework asp.net-mvc-4 linq-to-entities export-to-csv

我们正在测试我们的应用程序的功能,这里是场景,我们有一个包含500万条记录的表,我们想将它导出到csv,所以我们成功地创建了一个csv编写器类。主要问题是当我们导出整个记录时,我们捕获OOM异常(内存不足异常),当数据超过一百万时,用户可以选择导出哪些列更加困难。  有什么办法可以很好地捕捉到没有阻塞过程的事情吗?什么类型的过程最适合这种情况???我应该使用(以及如何)使用后台进程吗??

任何观点(例子)都很受欢迎。感谢...

2 个答案:

答案 0 :(得分:5)

如此简短的描述难以回答。 根据您的标签;它似乎是一个基于ASP.NET MVC4的网站。 似乎也是;您正在尝试即时创建CSV。 (即在单个http呼叫内) 我个人更喜欢基于AJAX的解决方案,其顺序如下。

  1. 用户启动导出。
  2. 服务器接收导出请求并启动后台作业以创建CSV文件。 (可能在不同的过程中)并返回说明作业开始的状态(带有作业ID)。
  3. 实施监控此作​​业的机制。可能有关于工作状态和进度的数据库条目。
  4. 在前端,定期的AJAX调用会检查作业状态;并向用户显示进度。
  5. 一旦工作完成;提供下载链接供用户下载您的大文件。
  6. 适当实施;这种方法有以下好处。

    • 非阻塞和互动。
    • 它可以处理真正庞大的工作。
    • 用户有机会取消该作业。
    • 每个工作都在一个单独的过程中运行;给它自己的记忆空间。
    • 可以扩展到多个服务器。

    虽然你可以看到;它有它自己的开销。

答案 1 :(得分:0)

使用文件助手库参见文章

@ FileHelpers throws OutOfMemoryException when parsing large csv file

你可以通过nuget

获得它