設置 | 登錄 | 註冊

目前共有9篇帖子。

20260604_test.zip

1樓 巨大八爪鱼 2026-6-4 18:58
【IoTDB.hpp】
#include <Session.h>
#include <SessionBuilder.h>

template <typename DataType>
class Database {
public:
    Database(size_t batch_size = 5000, int retry_time = 3);
    bool insert(const std::vector<DataType>& data);
protected:
    std::vector<std::pair<int64_t, DataType>> m_batched_data;
    size_t m_batch_size;
    int m_retry_time;

    virtual bool do_insert(const std::vector<std::pair<int64_t, DataType>>& data) = 0;
};

template <typename DataType>
Database<DataType>::Database(size_t batch_size, int retry_time) : m_batch_size(batch_size), m_retry_time(retry_time) {

}

template <typename DataType>
bool Database<DataType>::insert(const std::vector<DataType>& data) {
    int64_t time = std::time(NULL) * 1000;
    time = time - data.size() + 1;

    for (const DataType& item : data) {
        std::pair<int64_t, DataType> pair(time, item);
        m_batched_data.push_back(pair);
        time++;
    }

    if (m_batched_data.size() >= m_batch_size) {
        bool flag = do_insert(m_batched_data);
        if (!flag) {
            return false;
        }
        m_batched_data.clear();
    }
    return true;
}

template <typename DataType>
class IoTDB : public Database<DataType> {
public:
    IoTDB(const std::string& path, size_t batch_size = 5000, int retry_time = 3);
    ~IoTDB();
protected:
    bool do_insert(const std::vector<std::pair<int64_t, DataType>>& data);
private:
    std::string m_path;
    std::string m_device_id;
    std::string m_measurement;
    std::shared_ptr<Session> m_session;
};

template <typename DataType>
IoTDB<DataType>::IoTDB(const std::string& path, size_t batch_size, int retry_time) : Database<DataType>(batch_size, retry_time), m_path(path) {
    size_t i = path.find_last_of('.');
    if (i == std::string::npos) {
        throw std::invalid_argument("path does not contain '.'");
    }
    m_device_id = path.substr(0, i);
    m_measurement = path.substr(i + 1);
    std::cout << "m_device_id=" << m_device_id << ", m_measurement=" << m_measurement << std::endl;
    
    SessionBuilder builder;
    builder.enableAutoFetch(false);
    builder.host("8.130.22.178");
    builder.rpcPort(6667);
    builder.username("root");
    builder.password("root");
    m_session = builder.build();
}

template <typename DataType>
IoTDB<DataType>::~IoTDB() {
    m_session->close();
}

template <typename DataType>
bool IoTDB<DataType>::do_insert(const std::vector<std::pair<int64_t, DataType>>& data) {
    std::vector<std::string> measurements;
    measurements.push_back(m_measurement);

    for (const std::pair<int64_t, DataType>& pair : data) {
        const int64_t& time = std::get<0>(pair);
        std::vector<std::string> measurements_data;
        measurements_data.push_back(std::get<1>(pair));
        m_session->insertRecord(m_device_id, time, measurements, measurements_data);
    }
    return true;
}

2樓 巨大八爪鱼 2026-6-4 18:58

【test.cpp】

#include "IoTDB.hpp"

int main() {
    IoTDB<std::string> iotdb("root.test.t1", 3);
    std::vector<std::string> data = {"Shujen", "Chang", "is", "a", "gay"};
    bool flag = iotdb.insert(data);
    std::cout << "flag=" << (int)flag << std::endl;
    return 0;
}

3樓 巨大八爪鱼 2026-6-4 18:58

【test2.cpp】

#include "IoTDB.hpp"

uint64_t get_us() {
    struct timeval tv;

    gettimeofday(&tv, NULL);
    return tv.tv_sec * 1000000ull + tv.tv_usec;
}

int main(int argc, char *argv[]) {
    int count = 5;
    if (argc > 1) {
        count = std::stoi(argv[1]);
    }
    std::cout << "count=" << count << std::endl;

    IoTDB<std::string> iotdb("root.test.t1", 1000);
    std::vector<std::string> data = {"Shujen", "Chang", "is", "a", "gay"};
    uint64_t t1 = get_us();
    for (int i = 0; i < count; i += data.size()) {
        bool inserted = iotdb.insert(data);
        if (!inserted) {
            std::cout << "failed: i=" << i << std::endl;
            break;
        }
        uint64_t t2 = get_us();
        std::cout << "i=" << i << ", time=" << t2 - t1 << "us" << std::endl;
    }
    return 0;
}

4樓 巨大八爪鱼 2026-6-4 18:59

【Makefile】

IOTDB_DIR=$(realpath ../iotdb-cpp)
IOTDB=-I$(IOTDB_DIR)/iotdb-client/client-cpp/src/main \
      -I$(IOTDB_DIR)/iotdb-client/client-cpp/target/thrift/include \
      -I$(IOTDB_DIR)/iotdb-client/client-cpp/target/client-cpp-2.0.7-SNAPSHOT-cpp-linux-x86_64/include \
      -L$(IOTDB_DIR)/iotdb-client/client-cpp/target/build/main -liotdb_session \
      -Wl,-rpath,$(IOTDB_DIR)/iotdb-client/client-cpp/target/build/main

all: test test2

test: test.cpp IoTDB.hpp
    $(CXX) $(filter %.cpp, $^) -o $@ $(IOTDB)

test2: test2.cpp IoTDB.hpp
    $(CXX) $(filter %.cpp, $^) -o $@ $(IOTDB)

5樓 巨大八爪鱼 2026-6-4 18:59
测试结论:插入1000条数据要17秒。
6樓 巨大八爪鱼 2026-6-4 18:59

IoTDB> select * from root.test;
+-----------------------------+------------+
|                         Time|root.test.t1|
+-----------------------------+------------+
|1970-01-21T22:36:07.091+08:00|      Shujen|
|1970-01-21T22:36:07.092+08:00|       Chang|
|1970-01-21T22:36:07.093+08:00|          is|
|1970-01-21T22:36:07.094+08:00|           a|
|1970-01-21T22:36:07.095+08:00|         gay|
|2026-06-04T18:19:00.996+08:00|      Shujen|
|2026-06-04T18:19:00.997+08:00|       Chang|
|2026-06-04T18:19:00.998+08:00|          is|
|2026-06-04T18:19:00.999+08:00|           a|
|2026-06-04T18:19:01.000+08:00|         gay|
|2026-06-04T18:20:20.996+08:00|      Shujen|
|2026-06-04T18:20:20.997+08:00|       Chang|
|2026-06-04T18:20:20.998+08:00|          is|
|2026-06-04T18:20:20.999+08:00|           a|
|2026-06-04T18:20:21.000+08:00|         gay|
|2026-06-04T18:39:02.996+08:00|      Shujen|
|2026-06-04T18:39:02.997+08:00|       Chang|
|2026-06-04T18:39:02.998+08:00|          is|
|2026-06-04T18:39:02.999+08:00|           a|
|2026-06-04T18:39:03.000+08:00|         gay|
|2026-06-04T18:42:19.996+08:00|      Shujen|
|2026-06-04T18:42:19.997+08:00|       Chang|
|2026-06-04T18:42:19.998+08:00|          is|
|2026-06-04T18:42:19.999+08:00|           a|
|2026-06-04T18:42:20.000+08:00|         gay|
|2026-06-04T18:47:01.996+08:00|      Shujen|
|2026-06-04T18:47:01.997+08:00|       Chang|
|2026-06-04T18:47:01.998+08:00|          is|
|2026-06-04T18:47:01.999+08:00|           a|
|2026-06-04T18:47:02.000+08:00|         gay|
|2026-06-04T18:47:59.996+08:00|      Shujen|
|2026-06-04T18:47:59.997+08:00|       Chang|
|2026-06-04T18:47:59.998+08:00|          is|
|2026-06-04T18:47:59.999+08:00|           a|
|2026-06-04T18:48:00.000+08:00|         gay|
|2026-06-04T18:50:14.996+08:00|      Shujen|
|2026-06-04T18:50:14.997+08:00|       Chang|
|2026-06-04T18:50:14.998+08:00|          is|
|2026-06-04T18:50:14.999+08:00|           a|
|2026-06-04T18:50:15.000+08:00|         gay|
|2026-06-04T18:50:30.996+08:00|      Shujen|
|2026-06-04T18:50:30.997+08:00|       Chang|
|2026-06-04T18:50:30.998+08:00|          is|
|2026-06-04T18:50:30.999+08:00|           a|
|2026-06-04T18:50:31.000+08:00|         gay|
|2026-06-04T18:50:45.996+08:00|      Shujen|
|2026-06-04T18:50:45.997+08:00|       Chang|
|2026-06-04T18:50:45.998+08:00|          is|
|2026-06-04T18:50:45.999+08:00|           a|
|2026-06-04T18:50:46.000+08:00|         gay|
|2026-06-04T18:50:59.996+08:00|      Shujen|
|2026-06-04T18:50:59.997+08:00|       Chang|
|2026-06-04T18:50:59.998+08:00|          is|
|2026-06-04T18:50:59.999+08:00|           a|
|2026-06-04T18:51:00.000+08:00|         gay|
|2026-06-04T18:51:13.996+08:00|      Shujen|
|2026-06-04T18:51:13.997+08:00|       Chang|
|2026-06-04T18:51:13.998+08:00|          is|
|2026-06-04T18:51:13.999+08:00|           a|
|2026-06-04T18:51:14.000+08:00|         gay|
|2026-06-04T18:51:28.996+08:00|      Shujen|
|2026-06-04T18:51:28.997+08:00|       Chang|
|2026-06-04T18:51:28.998+08:00|          is|
|2026-06-04T18:51:28.999+08:00|           a|
|2026-06-04T18:51:29.000+08:00|         gay|
|2026-06-04T18:51:41.996+08:00|      Shujen|
|2026-06-04T18:51:41.997+08:00|       Chang|
|2026-06-04T18:51:41.998+08:00|          is|
|2026-06-04T18:51:41.999+08:00|           a|
|2026-06-04T18:51:42.000+08:00|         gay|
|2026-06-04T18:51:55.996+08:00|      Shujen|
|2026-06-04T18:51:55.997+08:00|       Chang|
|2026-06-04T18:51:55.998+08:00|          is|
|2026-06-04T18:51:55.999+08:00|           a|
|2026-06-04T18:51:56.000+08:00|         gay|
|2026-06-04T18:52:09.996+08:00|      Shujen|
|2026-06-04T18:52:09.997+08:00|       Chang|
|2026-06-04T18:52:09.998+08:00|          is|
|2026-06-04T18:52:09.999+08:00|           a|
|2026-06-04T18:52:10.000+08:00|         gay|
|2026-06-04T18:52:40.996+08:00|      Shujen|
|2026-06-04T18:52:40.997+08:00|       Chang|
|2026-06-04T18:52:40.998+08:00|          is|
|2026-06-04T18:52:40.999+08:00|           a|
|2026-06-04T18:52:41.000+08:00|         gay|
|2026-06-04T18:52:44.996+08:00|      Shujen|
|2026-06-04T18:52:44.997+08:00|       Chang|
|2026-06-04T18:52:44.998+08:00|          is|
|2026-06-04T18:52:44.999+08:00|           a|
|2026-06-04T18:52:45.000+08:00|         gay|
|2026-06-04T18:52:59.996+08:00|      Shujen|
|2026-06-04T18:52:59.997+08:00|       Chang|
|2026-06-04T18:52:59.998+08:00|          is|
|2026-06-04T18:52:59.999+08:00|           a|
|2026-06-04T18:53:00.000+08:00|         gay|
+-----------------------------+------------+
Total line number = 95
It costs 0.041s
IoTDB>

7樓 巨大八爪鱼 2026-6-4 20:03

用insertAlignedRecords函数一次性插入1000条数据,用时243毫秒。

template <typename DataType>

bool IoTDB<DataType>::do_insert(const std::vector<std::pair<int64_t, DataType>>& data) {

    std::vector<std::string> device_ids;

    std::vector<int64_t> times;

    std::vector<std::vector<std::string>> measurements_list;

    std::vector<std::vector<DataType>> values_list;

    for (const std::pair<int64_t, DataType>& pair : data) {

        device_ids.push_back(m_device_id);

        times.push_back(std::get<0>(pair));

        measurements_list.emplace_back().push_back(m_measurement);

        values_list.emplace_back().push_back(std::get<1>(pair));

    }

    m_session->insertAlignedRecords(device_ids, times, measurements_list, values_list);

    return true;

}

8樓 巨大八爪鱼 2026-6-4 20:06

用insertRecords函数一次性插入1000条数据,用时207毫秒。

template <typename DataType>

bool IoTDB<DataType>::do_insert(const std::vector<std::pair<int64_t, DataType>>& data) {

    std::vector<std::string> device_ids;

    std::vector<int64_t> times;

    std::vector<std::vector<std::string>> measurements_list;

    std::vector<std::vector<DataType>> values_list;

    for (const std::pair<int64_t, DataType>& pair : data) {

        device_ids.push_back(m_device_id);

        times.push_back(std::get<0>(pair));

        measurements_list.emplace_back().push_back(m_measurement);

        values_list.emplace_back().push_back(std::get<1>(pair));

    }

    m_session->insertRecords(device_ids, times, measurements_list, values_list);

    return true;

}

巨大八爪鱼insertRecords函数:
100条   32.617ms
500条   106.237ms
1000条  204.283ms
5000条  979.3ms
10000条 1946.81ms
50000条 9627.06ms

內容轉換:

回覆帖子
內容:
用戶名: 您目前是匿名發表。
驗證碼:
看不清?換一張