【问题标题】:Inserting large csv files into a database将大型 csv 文件插入数据库
【发布时间】:2024-05-19 13:05:02
【问题描述】:

我们在网络上有一个应用程序,它必须允许用户上传带有邮政编码的文件,这些文件是 .csv 文件。任何用户都可以从他们的计算机上传文件,问题是文件可能包含数千条记录。现在我正在获取文件,确保它具有正确的标题,但我正在将记录一一推送到数据库中。

我正在使用 c# asp.net,有没有更好的方法来做到这一点?从代码中更有效?我们不能使用任何外部导入器或数据导入器或 sql server 商业智能等工具。我该怎么做?,我正在阅读有关将其放入内存然后将其推送到数据库的内容?任何网址、示例或建议将不胜感激。

问候

【问题讨论】:

    标签: c# asp.net file-upload csv


    【解决方案1】:

    首先,我很确定您要问的实际上是“如何处理大文件并将处理后的数据插入数据库?”

    现在假设我是对的,我会说这个问题类似于“一根绳子有多长?”。现实情况是,将大文件处理到数据库中的实现高度特定于您的要求。

    但是,在最简单的情况下,您可以简单地将文件直接上传到表(或文件夹)中并创建一个 windows service,它每 x 分钟运行一次,遍历表,选择每个文件并处理您的数据使用批量插入和prepare method(这可能会给您带来一些性能优势)。

    或者,您可以查看MSMQ (Microsoft Message Queuing) 之类的内容,并将任何上传的文件直接保存到队列中,然后该队列完全独立于您的应用程序,并且可以在任何时间点进行处理,并且可以轻松扩展。

    但说到底,老实说,我不认为这里的任何人都可以为您的问题提供“正确”的答案,因为真的没有,您只能找到对实施的改进通过实验。

    【讨论】:

      【解决方案2】:

      如果这包含多达一百万条记录,最好的做法是创建一个服务来管理向数据库中插入记录以避免超时并防止 web iis 压力。

      如果您将其设为 Windows 服务,您可以通知该服务处理上传的某个目录中的 zip 文件。

      另外,我建议使用批量插入来实现更快的数据库事务。

      如果有验证,您可以将数据暂存到不同的数据库并验证数据,然后推送到最终数据库。

      【讨论】:

        【解决方案3】:

        由于这些记录在同一个表中,因此不会相互关联,Parallel.ForEach 在这里可能是一个有效的答案。假设您有一个将单个记录插入数据库的静态方法(可能不一定是静态的),您可以在数组上运行 Parallel.ForEach 循环,其中数组的每个索引代表 CSV 的一行。

        这假设将大文件上传到服务器不是最初的问题。如果这也是问题的一部分,我建议压缩文件,然后在上传后使用SharpZipLib 之类的东西解压缩。由于文本压缩得非常好,从用户的角度来看,这可能是对性能的最大好处。

        【讨论】: