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

时间:2015-06-19 02:48:46

标签: python django io

我可能正在为一个菜鸟做太大的项目,但我正在尝试为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

我感谢您的任何指导。

2 个答案:

答案 0 :(得分:1)

Welp,我愚蠢。

批量创作是我的新朋友。

如果有人遇到同样的问题,请不要一次插入一行。每个create()调用都是一个insert语句。而是将对象添加到列表中,然后将bulk_create(the_list)添加到列表中。

答案 1 :(得分:1)

使用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