Python - 解析大文本文件并将数据插入数据库
Python - Parsing large text file and inserting data into database
对于菜鸟来说,我可能正在承担一个太大的项目,但我正在尝试为 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
感谢您提供的任何指导。
好吧,我很笨。
批量创建是我的新朋友。
如果有人遇到同样的问题,请不要一次插入一行。每个 create() 调用都是一个插入语句。相反,将对象添加到列表,然后 bulk_create(the_list)。
尝试使用 itertools.islice
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
对于菜鸟来说,我可能正在承担一个太大的项目,但我正在尝试为 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
感谢您提供的任何指导。
好吧,我很笨。
批量创建是我的新朋友。
如果有人遇到同样的问题,请不要一次插入一行。每个 create() 调用都是一个插入语句。相反,将对象添加到列表,然后 bulk_create(the_list)。
尝试使用 itertools.islice
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