2017-04-06 95 views
0

我在influx中存储了一些数据,并且令人困惑的是涌入量比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 

我的influx代码如下,我用相同的模式存储在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中默认是关闭的?有人可以指导我进行批量处理。我试图查看过去和谷歌,但无法解决我的问题。我是新手涌入db。我试图让它更快。 感谢您的任何帮助或提示。

回答

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 
+0

非常感谢您的帮助。我会尝试它,并会回来更新。 – rob

+0

你可以相应地编辑我的代码吗?因为我试图通过使用json_body和append来使用你的最后一个例子中的批处理想法,但它不适用于我。非常感谢 – rob

+0

我现在无法编辑它(我用手机),但为什么它不适合你?你有错误还是仍然很慢? @rob – Pigueiras