Django拥有庞大的mysql数据库

时间:2010-08-02 06:08:32

标签: python django csv

将数百万个记录csv文件导入django的最佳方法是什么。

目前使用python csv模块,处理100万条记录文件需要2-4天。它会检查记录是否已经存在,以及其他一些记录。

这个过程可以在几个小时内完成。

可以以某种方式使用memcache。

更新:还有django ManyToManyField字段也会被处理。这些如何与直接负载一起使用。

5 个答案:

答案 0 :(得分:3)

我不确定你的情况,但是我们和Django有类似的情况,其中有大约3000万条记录需要超过一天才能导入。

由于我们的客户完全不满意(存在丢失项目的危险),在使用Python进行了几次失败的优化尝试之后,我们采取了彻底的策略更改并使用Java和JDBC进行导入(仅限)(+一些mysql调优) ,导入时间缩短到约45分钟(由于非常好的IDE和分析器支持,使用Java非常容易优化。)

答案 1 :(得分:1)

我建议直接使用MySQL Python driver。此外,您可能需要考虑一些多线程选项。

答案 2 :(得分:0)

根据数据格式(您说的是CSV)和数据库,您可能最好将数据直接加载到数据库中(直接加载到Django管理的表中,或者加载到临时表中)。例如,Oracle和SQL Server提供了用于加载大量数据的自定义工具。在MySQL的情况下,你可以做很多技巧。例如,您可以编写perl / python脚本来读取CSV文件并使用insert语句创建SQL脚本,然后将SQL脚本直接提供给MySQL。

正如其他人所说的那样,在加载大量数据之前总是丢弃索引和触发器,然后再添加它们 - 在每次插入后重建索引是一个主要的处理命中。

如果您正在使用事务,请将其关闭或批量插入以防止事务过大(过大的定义会有所不同,但如果您要执行100万行数据,请将其分解为1千笔交易可能是正确的。)

最重要的是,首先备份你的数据库!唯一比由于导入搞砸而从备份恢复数据库更糟糕的事情是没有要从中恢复的当前备份。

答案 3 :(得分:0)

如前所述,您希望绕过ORM并直接转到数据库。根据您使用的数据库类型,您可能会找到直接加载CSV数据的好选项。使用Oracle,您可以使用External Tables进行高速数据加载,对于mysql,您可以使用the LOAD command。我确信Postgres也有类似的东西。

加载数百万条记录不应该接近2-4天;我经常使用mysqldump在几分钟内将数百万行的数据库加载到运行在非常负载端机器上的mysql中。

答案 4 :(得分:0)

像克雷格说的那样,你最好先直接填充数据库。 它意味着创建适合CSV单元格的django模型(然后您可以创建更好的模型和脚本来移动数据)

然后,db feedding:这样做的首选工具是Navicat,你可以在他们的网站上获得一个功能30天的演示。它允许您在MySQL中导入CSV,将输入配置文件保存为XML ...
然后我将从Django中启动数据控制脚本,当你完成后,使用South迁移模型以获得你想要的东西,或者像我之前说的那样,在你的项目中创建另一组模型并使用脚本转换/复制数据。