gpt4 book ai didi

c++ - 优化我的代码模拟数据库

转载 作者:太空狗 更新时间:2023-10-29 21:07:20 25 4
gpt4 key购买 nike

我一直在做一个程序,模拟一个小数据库,可以查询,写完代码后执行了,但是性能很差。它工作起来真的很慢。我试图改进它,但几个月前我自己开始使用 C++,所以我的知识仍然很低。所以我想找到一个提高性能的解决方案。

让我解释一下我的代码是如何工作的。在这里,我附上了一个关于我的代码如何工作的总结示例。

首先,我有一个 .txt 文件模拟一个数据库表,其中包含用“|”分隔的随机字符串。这里有一个表格示例(5 行和 5 列)。

Table.txt

0|42sKuG^uM|24465\lHXP|2996fQo\kN|293cvByiV
1|14772cjZ`SN|28704HxDYjzC|6869xXj\nIe|27530EymcTU
2|9041ByZM]I|24371fZKbNk|24085cLKeIW|16945TuuU\Nc
3|16542M[Uz\|13978qMdbyF|6271ait^h|13291_rBZS
4|4032aFqa|13967r^\\`T|27754k]dOTdh|24947]v_uzg

.txt 文件中的此信息由我的程序读取并存储在计算机内存中。然后,在进行查询时,我将访问存储在计算机内存中的这些信息。将数据加载到计算机内存中可能是一个缓慢的过程,但稍后访问数据会更快,这对我来说很重要。

这里是从文件中读取此信息并将其存储在计算机中的代码部分。

从 Table.txt 文件中读取数据并将其存储在计算机内存中的代码

string ruta_base("C:\\a\\Table.txt"); // Folder where my "Table.txt" is found

string temp; // Variable where every row from the Table.txt file will be firstly stored
vector<string> buffer; // Variable where every different row will be stored after separating the different elements by tokens.
vector<ElementSet> RowsCols; // Variable with a class that I have created, that simulated a vector and every vector element is a row of my table

ifstream ifs(ruta_base.c_str());

while(getline( ifs, temp )) // We will read and store line per line until the end of the ".txt" file.
{
size_t tokenPosition = temp.find("|"); // When we find the simbol "|" we will identify different element. So we separate the string temp into tokens that will be stored in vector<string> buffer

while (tokenPosition != string::npos)
{
string element;
tokenPosition = temp.find("|");

element = temp.substr(0, tokenPosition);
buffer.push_back(element);
temp.erase(0, tokenPosition+1);
}

ElementSet ss(0,buffer);
buffer.clear();
RowsCols.push_back(ss); // We store all the elements of every row (stores as vector<string> buffer) in a different position in "RowsCols"
}

vector<Table> TablesDescriptor;

Table TablesStorage(RowsCols);
TablesDescriptor.push_back(TablesStorage);

DataBase database(1, TablesDescriptor);

之后是重要部分。假设我想进行查询,并要求输入。假设我的查询是行“n”,以及连续的元组“numTuples”和列“y”。 (我们必须说列数由一个十进制数“y”定义,它将被转换为二进制并向我们显示要查询的列,例如,如果我要求第 54 列(二进制为 00110110)我将要求第 2、3、5 和 6 列)。然后我访问计算机内存以获取所需的信息并将其存储在一个 vector shownVector 中。在这里,我向您展示这段代码的一部分。

根据我的输入访问所需信息的代码

int n, numTuples; 
unsigned long long int y;
clock_t t1, t2;

cout<< "Write the ID of the row you want to get more information: " ;
cin>>n; // We get the row to be represented -> "n"

cout<< "Write the number of followed tuples to be queried: " ;
cin>>numTuples; // We get the number of followed tuples to be queried-> "numTuples"

cout<<"Write the ID of the 'columns' you want to get more information: ";
cin>>y; // We get the "columns" to be represented ' "y"

unsigned int r; // Auxiliar variable for the columns path
int t=0; // Auxiliar variable for the tuples path
int idTable;

vector<int> columnsToBeQueried; // Here we will store the columns to be queried get from the bitset<500> binarynumber, after comparing with a mask
vector<string> shownVector; // Vector to store the final information from the query
bitset<500> mask;
mask=0x1;

t1=clock(); // Start of the query time

bitset<500> binaryNumber = Utilities().getDecToBin(y); // We get the columns -> change number from decimal to binary. Max number of columns: 5000

// We see which columns will be queried
for(r=0;r<binaryNumber.size();r++) //
{
if(binaryNumber.test(r) & mask.test(r)) // if both of them are bit "1"
{
columnsToBeQueried.push_back(r);
}
mask=mask<<1;
}

do
{
for(int z=0;z<columnsToBeQueried.size();z++)
{
int i;
i=columnsToBeQueried.at(z);

vector<int> colTab;
colTab.push_back(1); // Don't really worry about this

//idTable = colTab.at(i); // We identify in which table (with the id) is column_i
// In this simple example we only have one table, so don't worry about this

const Table& selectedTable = database.getPointer().at(0); // It simmulates a vector with pointers to different tables that compose the database, but our example database only have one table, so don't worry ElementSet selectedElementSet;

ElementSet selectedElementSet;

selectedElementSet=selectedTable.getRowsCols().at(n);
shownVector.push_back(selectedElementSet.getElements().at(i)); // We save in the vector shownVector the element "i" of the row "n"

}
n=n+1;
t++;

}while(t<numTuples);

t2=clock(); // End of the query time

float diff ((float)t2-(float)t1);
float microseconds = diff / CLOCKS_PER_SEC*1000000;

cout<<"The query time is: "<<microseconds<<" microseconds."<<endl;

类定义

这里我附上了一些类定义,以便您可以编译代码,并更好地理解它是如何工作的:

class ElementSet
{
private:
int id;
vector<string> elements;

public:
ElementSet();
ElementSet(int, vector<string>);

const int& getId();
void setId(int);

const vector<string>& getElements();
void setElements(vector<string>);

};

class Table
{
private:
vector<ElementSet> RowsCols;

public:
Table();
Table(vector<ElementSet>);

const vector<ElementSet>& getRowsCols();
void setRowsCols(vector<ElementSet>);
};


class DataBase
{
private:
int id;
vector<Table> pointer;

public:
DataBase();
DataBase(int, vector<Table>);

const int& getId();
void setId(int);

const vector<Table>& getPointer();
void setPointer(vector<Table>);

};

class Utilities
{
public:
Utilities();
static bitset<500> getDecToBin(unsigned long long int);
};

所以我得到的问题是我的查询时间根据表的大小而有很大不同(它与具有 100 行和 100 列的表以及具有 10000 行和 1000 列的表无关)。这使得我的代码性能对于大表来说非常低,真正重要的是我......你知道我如何优化我的代码吗????

非常感谢您的帮助!!! :)

最佳答案

每当您遇到性能问题时,您要做的第一件事就是分析您的代码。 Here是可以在 Windows 上执行此操作的免费工具列表,here对于 Linux。剖析您的代码,找出瓶颈,然后回来提出具体问题。

此外,正如我在评论中所说,您不能只使用 SQLite 吗? ?它支持内存数据库,适合测试,而且轻量级和快速。

关于c++ - 优化我的代码模拟数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5389087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com