鍍金池/ 問答/Python  Linux  數(shù)據(jù)庫/ 一個10萬行的ngx日志,解析后如何快速的插入mysql?

一個10萬行的ngx日志,解析后如何快速的插入mysql?

大家好。
nginx log 目前每天大概10萬行數(shù)據(jù),現(xiàn)在用python解析出了每個字段,現(xiàn)在想插入到mysql數(shù)據(jù)庫里,用for實在太慢,請問有什么好的方法來搞。

回答
編輯回答
掛念你

批量插入啊, 一次1000條

executemany

2017年6月29日 07:27
編輯回答
喜歡你

用multiprocessing.dummy.Pool試試

2017年6月18日 09:28
編輯回答
硬扛

首先,如樓上所說,executemany,批量插入。每次插入500-1000條,然后commit一下。
此外,有點疑惑:
1、原始日志10萬條,解析之后,不應(yīng)該是歸并后入庫么?那時數(shù)據(jù)量還有那么多?
2、如果每天需要往數(shù)據(jù)庫插入10萬條數(shù)據(jù),那么三個月就將近1000萬了。而對于mysql來說,當(dāng)數(shù)據(jù)量上千萬之后,效率就比較低了??梢钥紤]別的存儲方式了,比如:ElasticSearch。

追答:批量插入代碼大概這樣(沒有實際運行)

    conn = ...
    cursor = ...
    with open('access.log', 'r') as f:
        c = 0
        data_list = []
        for line in f.readlines():
            # 解析日志,得到所需的字段(比如:時間、URL、IP)
            data_list.append(('2018-04-20 12:12:12', '/login/', '1.1.1.1'))
            c += 1
            if c % 1000 == 0:
                cursor.executemany('insert into access_table values(%s, %s, %s)', data_list)
                conn.commit()
                data_list = []
        if data_list:
            cursor.executemany('insert into access_table values(%s, %s, %s)', data_list)
            conn.commit()
    cursor.close()
    conn.close()
2017年2月24日 04:03