我的公司每月都会获得一组包含银行帐户信息的CSV文件,我需要将其导入数据库.其中一些文件可能非常大.例如,一个是大约33MB和大约65,000行.
现在我有一个symfony/Doctrine应用程序(PHP),它读取这些CSV文件并将它们导入数据库.我的数据库有大约35个不同的表,在导入过程中,我将这些行拆分为组成对象并将它们插入到数据库中.这一切都很漂亮,除了它很慢(每行大约需要四分之一秒)并且它使用了大量的内存.
内存使用非常糟糕,我必须拆分我的CSV文件.一个20,000行的文件几乎没有进入.当它接近结束时,我的内存使用率为95%.导入该65,000行文件根本不可能.
我发现symfony是构建应用程序的特殊框架,我通常不会考虑使用其他任何东西,但在这种情况下,我愿意以性能的名义将所有的先入之见抛到窗外.我没有承诺任何特定的语言,DBMS或任何东西.
Stack Overflow不喜欢主观问题,因此我将尽量使其成为非主观的:对于那些不仅仅有意见但有经验导入大型CSV文件的人,您使用了哪些工具/实践过去那已经成功了吗?
例如,您是否只使用Django的ORM/OOP并且您没有遇到任何问题?或者您是否将整个CSV文件读入内存并准备一些大量的INSERT声明?
同样,我不仅仅是一个意见,而是一些过去实际上对你有用的东西.
编辑:我不只是将85列CSV电子表格导入一个85列数据库表.我正在将数据规范化并将其放入几十个不同的表中.出于这个原因,我不能只使用LOAD DATA INFILE(我正在使用MySQL)或任何其他只读取CSV文件的DBMS功能.
此外,我不能使用任何Microsoft特定的解决方案.
Luc*_*Sam 17
如果我没有正确理解你的问题,请原谅我,但似乎你只是想把大量的CSV数据放到SQL数据库中.您是否有任何理由要使用Web应用程序或其他代码将CSV数据处理为INSERT语句?我已成功使用SQL Server Management Studio和使用BULK INSERT语句将大量CSV数据导入SQL Server Express(免费版).一个简单的批量插入看起来像这样:
BULK INSERT [Company].[Transactions]
FROM "C:\Bank Files\TransactionLog.csv"
WITH
(
FIELDTERMINATOR = '|',
ROWTERMINATOR = '\n',
MAXERRORS = 0,
DATAFILETYPE = 'widechar',
KEEPIDENTITY
)
GO
Run Code Online (Sandbox Code Playgroud)
kma*_*ks2 11
大约两周前,我遇到了同样的问题.我写了一些.NET来做ROW BY ROW插入,根据我的计算得到的数据量,用这种方式花费大约一周时间.
因此,我使用字符串构建器创建一个巨大的查询并将其一次性发送到我的关系系统.它从花了一个星期到花了5分钟.现在我不知道你正在使用什么样的关系系统,但是如果有大量的查询,你可能需要调整你的max_allowed_packet参数或者类似的.
第一:33MB 并不大.MySQL可以轻松处理这种大小的数据.
正如您所注意到的,逐行插入很慢.在其上使用ORM甚至更慢:构建对象,序列化等的开销很大.使用ORM在35个表中执行此操作甚至更慢.不要这样做.
你确实可以使用LOAD DATA INFILE; 只需编写一个脚本,将您的数据转换为所需的格式,然后将其分成流程中的每个表文件.然后,您可以将LOAD每个文件放入正确的表中.该脚本可以用任何语言编写.
除此之外,批量INSERT (column, ...) VALUES ...也有效.不要猜测你的行批量大小应该是多少; 根据经验确定时间,因为最佳批量大小取决于您的特定数据库设置(服务器配置,列类型,索引等)
Bulk INSERT不会那么快LOAD DATA INFILE,你仍然需要编写一个脚本来将原始数据转换为可用的INSERT查询.出于这个原因,我可能会LOAD DATA INFILE尽可能地做.
| 归档时间: |
|
| 查看次数: |
44882 次 |
| 最近记录: |