Как повысить производительность создания таблицы с помощью API c plus plus в DolphinDB - PullRequest
0 голосов
/ 19 сентября 2019

Я использую API-интерфейс DolphinDB c ++ для проверки производительности записи в базу данных и нахожу, что производительность сгенерированных данных относительно низкая.Есть ли способ улучшить это?Мой код показан ниже:

TableSP createDemoTable(long rows){
vector<string> colNames = {"fwname","filename","source_address","source_port","destination_address","destination_port","nat_source_address","nat_source_port","starttime","stoptime","elapsed_time"};
vector<DATA_TYPE> colTypes = {DT_SYMBOL,DT_STRING,DT_LONG,DT_LONG,DT_LONG,DT_LONG,DT_LONG,DT_LONG,DT_DATETIME,DT_DATETIME,DT_LONG};
int colNum = 11,rowNum = rows,indexCapacity=rows;
ConstantSP table = Util::createTable(colNames,colTypes,rowNum,indexCapacity);
vector<VectorSP> columnVecs;
for(int i = 0 ;i < colNum ;i ++)
    columnVecs.push_back(table->getColumn(i));

for(unsigned int i =  0 ;i < rowNum; i++){
    columnVecs[0]->set(i,Util::createString("10.189.45.2:9000"));
    columnVecs[1]->set(i,Util::createString("FWLOG_IOT22502_20190827110710_0000.DAT"));
    columnVecs[2]->set(i,Util::createLong(10*i));
    columnVecs[3]->set(i,Util::createLong(1*i));
    columnVecs[4]->set(i,Util::createLong(20*i));
    columnVecs[5]->set(i,Util::createLong(2*i));
    columnVecs[6]->set(i,Util::createLong(30*i));
    columnVecs[7]->set(i,Util::createLong(3*i));
    columnVecs[8]->set(i,Util::createDateTime(i+1568622660));
    columnVecs[9]->set(i,Util::createDateTime(i+1568622660+100));
    columnVecs[10]->set(i,Util::createLong(100));
}
return table;

}

1 Ответ

0 голосов
/ 27 сентября 2019

В вашем скрипте такие функции, как createString, createLong, довольно трудоемки.Кроме того, вызов таких функций, как setInt, setLong для добавления нескольких строк данных вместо массового добавления данных за строкой, может значительно повысить производительность.Вы можете обратиться к примерам в этом руководстве .Вот один из примеров, который, я думаю, может помочь.

TableSP createDemoTable(){
    vector<string> colNames = {"name", "date", "price"};
    vector<DATA_TYPE> colTypes = {DT_STRING, DT_DATE, DT_DOUBLE};
    int colNum = 3, rowNum = 10000, indexCapacity=10000;
    ConstantSP table = Util::createTable(colNames, colTypes, rowNum, indexCapacity);
    vector<VectorSP> columnVecs;
    for(int i = 0; i < colNum; ++i)
        columnVecs.push_back(table->getColumn(i));

    int array_dt_buf[Util::BUF_SIZE]; //定义date列缓冲区数组
    double array_db_buf[Util::BUF_SIZE]; //定义price列缓冲区数组

    int start = 0;
    int no=0;
    while (start < rowNum) {
        size_t len = std::min(Util::BUF_SIZE, rowNum - start);
        int *dtp = columnVecs[1]->getIntBuffer(start, len, array_dt_buf); //dtp指向每次通过`getIntBuffer`得到的缓冲区的头部
        double *dbp = columnVecs[2]->getDoubleBuffer(start, len, array_db_buf); //dbp指向每次通过`getDoubleBuffer`得到的缓冲区的头部
        for (int i = 0; i < len; ++i) {
            columnVecs[0]->setString(i+start, "name_"+std::to_string(++no)); //对string类型的name列直接进行赋值,不采用getbuffer的方式
            dtp[i] = 17898+i; 
            dbp[i] = (rand()%100)/3.0;
        }
        columnVecs[1]->setInt(start, len, dtp); //写完后使用`setInt`将缓冲区写回数组
        columnVecs[2]->setDouble(start, len, dbp); //写完后使用`setDouble`将缓冲区写回数组
        start += len;
    }
    return table;
}
...