如何将 CSV 文件迁移到 Sqlite3(或 MySQL)? - Python

Posted

技术标签:

【中文标题】如何将 CSV 文件迁移到 Sqlite3(或 MySQL)? - Python【英文标题】:How to migrate a CSV file to Sqlite3 (or MySQL)? - Python 【发布时间】:2011-04-26 21:40:33 【问题描述】:

我正在使用 Python 来逐行保存数据...但这非常慢!

CSV 包含 7000 万行,而使用我的脚本我只能存储 1000 秒


这就是我的脚本的样子

reader = csv.reader(open('test_results.csv', 'r'))
for row in reader:
    TestResult(type=row[0], name=row[1], result=row[2]).save()

我认为对于测试我可能不得不考虑 mysql 或 PostgreSQL。

有什么想法或提示吗?这是我第一次处理如此海量的数据。 :)

【问题讨论】:

sqlite 比 mysql 慢。 mongoDB 通常插入速度更快,尽管它有其他限制 什么是TestResult?您没有显示对 sqlite3 的任何实际调用,因此很难对代码进行评论。如果您跳过save(),然后将TestResult 构造替换为pass,那么基线阅读时间是多少? Testresult 是 Django ORM 的 Model 子类 TestResult.save() 有什么作用?它会打开一个文本文件,保存一行,然后再次关闭文件吗?还是其他明显慢的东西? 【参考方案1】:

我不知道这是否会产生足够大的差异,但由于您正在处理 Django ORM,我可以建议以下内容:

    确保在您的 Django 设置文件中 DEBUG 为 False,否则您会将每个查询都存储在内存中。 将您的逻辑放入主函数中,并将其包装在 django.db.transactions.commit_on_success 装饰器中。这将防止每一行都需要自己的事务,从而大大加快流程。 如果您知道文件中的所有行都不存在于数据库中,请将 force_insert=True 添加到对 save() 方法的调用中。这将使所需的 sqlite 调用次数减半。

如果您发现自己使用的是客户端-服务器 DBMS,这些建议可能会产生更大的影响。

【讨论】:

【参考方案2】:

对于 MySQL 导入:

mysqlimport [options] db_name textfile1 [textfile2 ...]

对于 SQLite3 导入:

参考How to import load a .sql or .csv file into SQLite?

【讨论】:

以上是关于如何将 CSV 文件迁移到 Sqlite3(或 MySQL)? - Python的主要内容,如果未能解决你的问题,请参考以下文章

如何在 sqlite3 中正确导入和配置 .csv 表

使用 Python 将 CSV 文件导入 sqlite3 数据库表

使用 Python 或 R 将非常大的 sql 文件导出到 csv

如何优雅的将数据从sqlite3迁移到mysql

数据从sqlite3迁移到mysql中遇到的问题

excel里面的数据如何导入SQLite3