我们在网络上有一个应用程序,必须允许用户上传带有邮政编码的文件,这些文件是.csv的文件。任何用户都可以从他们的计算机上传文件,问题是该文件可能包含数千条记录。现在我收到文件,确保它有正确的标题,但我将记录逐个推入数据库。
我正在使用c#asp.net,有没有更好的方法呢?从代码中提高效率?我们无法使用任何外部导入程序或数据导入程序或sql server商业智能等工具。我怎么能这样做?我正在读一些关于将它放入内存然后将其推送到数据库的东西?任何网址,示例或建议都会非常感激。
此致
答案 0 :(得分:1)
如果这包含多达一百万条记录,最好这样做就是创建一项服务来管理将记录插入数据库以避免超时并防止网络压力。
如果你把它作为一个Windows服务,你可以通知服务处理上传它的某个目录中的zip文件。
另外,我建议使用批量插入来加快数据库事务的速度。
如果有验证,您可以将数据分段到不同的数据库并验证数据,然后推送到最终数据库。
答案 1 :(得分:1)
首先,我很确定您所问的实际上是“如何处理大型文件并将处理后的数据插入数据库?”。
现在假设我是正确的,我会说这个问题类似于“一根绳子有多长?”。实际情况是,将大型文件处理到数据库的实现非常符合您的要求。
然而,在最简单的光谱结束时,您只需将文件直接上传到表格(或文件夹)中,然后创建一个每隔x分钟运行一次的windows service,遍历表格,选择每个文件和进程您的数据使用批量插入和prepare method(这可能会带来一些性能优势)。
或者您可以查看MSMQ (Microsoft Message Queuing)之类的内容,并将所有上传的文件直接保存到队列中,然后该队列完全独立于您的应用程序,并且可以在任何时间点进行处理并轻松扩展。
在一天结束时,老实说,我认为这里的任何人都不能给你一个'正确'的问题答案,因为真的没有一个,你只能找到改进你的实施通过实验。
答案 2 :(得分:1)
由于这些记录位于同一个表中,因此彼此无关,因此Parallel.ForEach可能是一个有效的答案。假设您有一个静态方法(可能不一定需要是静态的)将单个记录插入到数据库中,您可以在数组上运行Parallel.ForEach循环,其中数组的每个索引代表一行CSV。 / p>
这假设将大文件上传到服务器不是最初的问题。如果这也是问题的一部分,我会建议压缩文件,然后使用SharpZipLib之类的东西在上传后将其解压缩。由于文本压缩得很好,从用户的角度来看,这可能是表现最大的好处。