为什么涌入性能如此之慢

时间:2017-04-06 09:52:08

标签: python mysql csv influxdb

我将一些数据存储在涌入中,并且令人困惑的是,流入速度是Mysql的4-5倍。我尝试通过在mysql中插入10000行然后在Influxdb中进行测试。 以下是统计数据。

Mysql

real: 6m 39sec
user: 2.956sec  
sys: 0.504sec

Influxdb

real: 6m 17.193sec
user: 11.860sec
sys: 0.328sec

我的涌入代码如下,我使用相同的模式存储在mysql中。

#!/usr/bin/env python
# coding: utf-8
import time
import csv
import sys
import datetime
import calendar
import pytz
from influxdb import client as influxdb
from datetime import datetime

host = 'localhost'
port = 8086
user = "admin"
password = "admin"
db_name = "testdatabase"
db = influxdb.InfluxDBClient(database=db_name)


def read_data():
    with open(file) as f:
        reader = f.readlines()[4:]
       for line in reader:
            yield (line.strip().split(','))


fmt = '%Y-%m-%d %H:%M:%S'
file = '/home/rob/mycsvfile.csv'

csvToInflux = read_data()
body = []
for metric in csvToInflux:
    timestamp = datetime.strptime(metric[0][1: len(metric[0]) - 1], fmt)

    new_value = float(metric[1])
    body.append({
        'measurement': 'mytable1',
        'time': timestamp,
        'fields': {
             'col1': metric[1],
             'col2': metric[2],
             'col3': metric[3],
             'col4': metric[4],
             'col5': metric[5],
             'col6': metric[6],
             'col7': metric[7],
             'col8': metric[8],
             'col9': metric[9]
        }
        })
    db.write_points(body)

有人可以告诉我如何改进它。我想这可能是由于缓存。在Influx db中默认关闭缓存选项吗?并且有人可以指导我在涌入中进行批量处理。我试着看看SO和谷歌,但无法解决我的问题。我是新手涌入db。我想让它更快。 感谢您的帮助或提示。

1 个答案:

答案 0 :(得分:1)

逐个插入到Influxdb中很慢,你应该分批进行。例如,尝试使用10000行的CSV(逐个):

with open('/tmp/blah.csv') as f:
    lines = f.readlines()

import influxdb

inf = influxdb.InfluxDBClient('localhost', 8086, 'root', 'root', 'example1')

for line in lines:
    parts = line.split(',')
    json_body = [{
        'measurement': 'one_by_one',
        'time': parts[0],
        'fields':{
            'my_value': int(parts[1].strip())
        }
    }]
    inf.write_points(json_body)

这给了我

的结果
└─ $ ▶ time python influx_one.py

real    1m43.655s
user    0m19.547s
sys     0m3.266s

进行一些小改动,一次性插入CSV的所有行:

json_body = []
for line in lines:
    parts = line.split(',')
    json_body.append({
        'measurement': 'one_batch',
        'time': parts[0],
        'fields':{
            'my_value': int(parts[1].strip())
        }
    })

inf.write_points(json_body)

结果要好得多:

└─ $ ▶ time python influx_good.py

real    0m2.693s
user    0m1.797s
sys     0m0.734s