Python—解析大型文本文件并将数据插入数据库

Python—解析大型文本文件并将数据插入数据库,python,django,io,Python,Django,Io,对于noob来说,我可能承担了太大的项目,但我正在尝试为KickassTorrents托管一个非官方的API。目前,他们提供整个数据库的文本转储,通常在650Mb左右 现在,我正在使用Python读取文本文件,并使用Django的ORM将其插入数据库: with open('hourlydump.txt', 'r') as f: for line in f: sections = line.split('|') Torrent.o

对于noob来说,我可能承担了太大的项目,但我正在尝试为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
我很感激你给我的任何指导。

好吧,我很笨

Bulk create是我的新朋友

如果有人有同样的问题,不要一次插入一行。每个create()调用都是一条insert语句。相反,将对象添加到列表中,然后批量创建(列表)

使用

my_lines
是一个生成器对象,它为您提供文件的每一行,并可在如下循环中使用:

for line in mylines:
    print line

输入文件是什么样子的?就像这样(每条记录都在一行上):torrent_info|hash | torrent|name | torrent|u category | torrent_info|url | torrent|u download|url | size | category| id | files | count seeders | seeders | leechers | upload| date那是一行?而
|
之间的每一个块都会进入表中的一列?这就是每一行的格式。我正在标记每个部分(torrent_info_散列、torrent_名称等),并将它们插入torrent对象中相应的字段,然后在db中创建该行。我猜开销可能是在创建数千个对象上,我不确定。对于这样的东西,我经常发现使用
csv
模块读取数据,然后直接使用
sqlite3
模块加载到数据库中要快得多。
for line in mylines:
    print line