【问题标题】:Why influx performance is so slow为什么流入性能如此缓慢
【发布时间】:2017-09-01 06:36:37
【问题描述】:

我在 influx 中存储了一些数据,而 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 中的缓存选项是否默认关闭?有人可以指导我在大量涌入中进行批处理。我尝试查看 SO 和 google 但无法解决我的问题。我是涌入数据库的新手。我正在努力让它更快。 感谢您提供任何帮助或提示。

【问题讨论】:

    标签: python mysql csv influxdb


    【解决方案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
    

    【讨论】:

    • 非常感谢您的帮助。我会尝试并会回来更新。
    • 您能否相应地编辑我的代码,因为我尝试通过使用 json_body 和 append 来使用您最后一个示例中的批处理想法,但它对我不起作用。非常感谢
    • 我现在无法编辑它(我正在使用手机)但为什么它不适合您?你得到一个错误还是仍然很慢? @rob
    • 它正在工作但仍然一样,意味着它仍然太慢。我会根据你的建议改变我的问题。稍后会通知您。
    • @我编辑了我的问题,我包括批处理尝试,但不确定是否正确完成。如果我做得正确,那么它仍然和以前一样,意味着非常慢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 2013-10-19
    • 2011-05-03
    相关资源
    最近更新 更多