我可能正在为一个菜鸟做太大的项目,但我正在尝试为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
我感谢您的任何指导。
答案 0 :(得分:1)
Welp,我愚蠢。
批量创作是我的新朋友。
如果有人遇到同样的问题,请不要一次插入一行。每个create()调用都是一个insert语句。而是将对象添加到列表中,然后将bulk_create(the_list)添加到列表中。
答案 1 :(得分:1)
from itertools import islice
with open('hourlydump.txt', 'r') as f
my_lines = islice(f, N) #number of lines taken in each iteration.
#Do your operations here
my_lines
是一个生成器对象,它为您提供文件的每一行,并且可以在这样的循环中使用:
for line in mylines:
print line