1

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

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

问候

4

3 回答 3

1

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

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

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

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

于 2012-10-05T00:28:04.317 回答
1

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

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

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

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

但归根结底,老实说,我认为这里的任何人都无法为您的问题提供“正确”的答案,因为实际上没有答案,您只能通过实验找到对实施的改进。

于 2012-10-05T00:47:39.193 回答
1

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

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

于 2012-10-05T00:57:36.383 回答