【发布时间】:2015-06-19 02:48:46
【问题描述】:
对于菜鸟来说,我可能承担了太大的项目,但我正在尝试为 KickassTorrents 托管一个非官方的 API。目前,他们提供整个数据库的文本转储,通常约为 650Mb。
现在我正在使用 Python 读取文本文件并使用 Django 的 ORM 将其插入到我的数据库中:
with open('hourlydump.txt', 'r') as f:
for line in f:
sections = line.split('|')
Torrent.objects.create(...)
使用他们每小时的转储作为测试(大约 900kb),我得出了大约两分钟的执行时间。显然,以这种速度扩展到 700Mb 是不切实际的。
我认为这个问题有一个解决方案,但我不确定它会是什么。我确信将他们的整个数据库加载到我自己的数据库中的时间仍然很长,但我希望有一个我不知道的更有效的解决方案,它将执行时间减少到不到 25 小时。
编辑:瓶颈几乎肯定是插入数据库。
使用 ORM 插入:
$ python manage.py create_data
Execution time: 134.284000158
只需创建对象并将它们存储在列表中:
$ python manage.py create_data
Execution time: 1.18499994278
感谢您提供的任何指导。
【问题讨论】:
-
输入文件是什么样的?
-
像这样(每条记录都在新的一行):torrent_info_hash|torrent_name|torrent_category|torrent_info_url|torrent_download_url|size|category_id|files_count|seeders|leechers|upload_date
-
只有一行?
|之间的每个块都进入表中的一列? -
那是每一行的格式。我正在标记每个部分(torrent_info_hash、torrent_name 等)并将它们插入到 Torrent 对象中的相应字段中,然后在数据库中创建该行。我想开销可能是创建数千个对象,我不确定。
-
对于这样的事情,我经常发现使用
csv模块读取数据然后直接使用sqlite3模块加载到数据库中要快得多。