每个月,我的公司会得到一组CSV文件,其中包含银行账户信息,需要将其导入数据库。其中一些文件可能非常大。例如,一个文件大小约为33MB,有大约65,000行。
目前,我有一个symfony / Doctrine应用程序(PHP),可以读取这些CSV文件并将它们导入数据库。我的数据库有大约35个不同的表格,在导入过程中,我将这些行拆分成各自的对象并将其插入到数据库中。这一切都很完美,只是速度较慢(每行大约需要0.25秒)并且占用大量的内存。
内存使用情况非常糟糕,以至于我必须拆分CSV文件。一个有20,000行的文件勉强能够导入完成。当接近结束时,我使用了95%的内存。无法导入65,000行文件。
我发现Symfony是构建应用程序的卓越框架,通常我不会考虑使用其他任何东西,但在这种情况下,我愿意抛开所有预设,以追求更好的性能。我没有承诺任何特定的语言,DBMS或任何其他内容。
Stack Overflow不喜欢主观问题,因此我将尝试尽可能使其客观:对于那些不仅具有 导入大型CSV文件的经验,还使用过哪些工具/实践,这些工具/实践在过去是成功的?
例如,您是否只使用Django的ORM / OOP,并且没有遇到任何问题?还是将整个CSV文件读入内存并准备了一些巨大的INSERT
语句?
再次强调,我需要的不仅是意见,而是在过去实际有效的方法。
编辑:我不仅要将一个具有85列的CSV电子表格导入到一个具有85列的数据库表中。我正在对数据进行规范化并将其放入数十个不同的表格中。因此,我不能只使用LOAD DATA INFILE
(我使用的是MySQL)或其他DBMS的只读取CSV文件的功能。
此外,我不能使用任何微软特定的解决方案。
INSERT
语句本身而言,我还没有进行任何性能分析。如果有任何建议,将不胜感激。(然而光凭这一点并不能解决我的内存使用问题。) - Jason Swett