【问题标题】:Python - Parsing large text file and inserting data into databasePython - 解析大型文本文件并将数据插入数据库
【发布时间】: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 模块加载到数据库中要快得多。

标签: python django io


【解决方案1】:

哎呀,我很笨。

批量创建是我的新朋友。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-03-30
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      • 2018-12-31
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      • 1970-01-01
      相关资源
      最近更新 更多