如何将 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的主要内容,如果未能解决你的问题,请参考以下文章
使用 Python 将 CSV 文件导入 sqlite3 数据库表