【问题标题】:How to migrate a CSV file to Sqlite3 (or MySQL)? - Python如何将 CSV 文件迁移到 Sqlite3(或 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() 有什么作用?它会打开一个文本文件,保存一行,然后再次关闭文件吗?还是其他明显慢的东西?

标签: python mysql django sqlite csv


【解决方案1】:

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

  1. 确保在您的 Django 设置文件中 DEBUG 为 False,否则您会将每个查询都存储在内存中。
  2. 将您的逻辑放入主函数中,并将其包装在 django.db.transactions.commit_on_success 装饰器中。这将防止每一行都需要自己的事务,从而大大加快流程。
  3. 如果您知道文件中的所有行都不存在于数据库中,请将 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?

    【讨论】:

      猜你喜欢
      • 2011-01-20
      • 1970-01-01
      • 2018-10-11
      • 1970-01-01
      • 2016-04-13
      • 1970-01-01
      • 2020-08-23
      • 2013-06-04
      • 1970-01-01
      相关资源
      最近更新 更多