如何提高在c++中读取csv的速度



我目前正在做我的项目,但整个程序浪费了太多时间。

经过一些测试,我发现这个程序在I/O上花费了太多时间。

因为每个文件都有不同的数据大小,而且我在程序中使用随机元素,所以很难提前读取。

希望有人能帮我处理。

vector<string> _csv(string s)
{
vector<string> arr;
istringstream delim(s);
string token;
int c = 0;
while (getline(delim, token, ','))
{
arr.push_back(token);
c++;
}
return arr;
}
string filename = company[0] + "_RSI" + std::to_string(rsi[j][24]) + ".csv";
// cout << filename << endl;
ifstream inFile(".\RSI1~256\" + filename, ios::in);
if (!inFile) {
cout << "Open failed!" << endl;
exit(1);
}
string line;
while (getline(inFile, line)) {
vector<string> a = _csv(line);
RSI.push_back(atof(a[2].c_str()));
price.push_back(atof(a[1].c_str()));
date.push_back(a[0]);
}

ifstream中使用缓冲区。至少在没有缓冲区的情况下,MSVC实现的性能很差。

std::vector<char> buffer(256 * 1024);
std::ifstream inFile(".\RSI1~256\" + filename, std::ios::in);
inFile.rdbuf()->pubsetbuf(buffer.data(), buffer.size());

注意-语句必须按照所示的正确顺序,以确保流的缓冲区寿命正确。

可能的优化:不要直接使用CSV文件,而是一个压缩的缓存版本,加载后可以用zlib(或Poco.Zip,或其他什么(解压缩
根据您的平均CSV文件内容,这可能会大大减少您需要从磁盘加载的数据量。也许您的整个数据库可以加载到RAM中,并在需要时选择性地解压缩一些条目。

└── your-database/
├── file0001.csv
├── file0002.csv
├── ...
└── cache/
├── file0001.csv.zip
└── file0001.csv.zip
└── ...

首先,做一些分析,看看你在哪里花了太多时间。

如果你在getline调用上花费了太多时间,你可能需要专注于如何将数据放入内存,即通过读取更大的块或使用其他技术(操作系统特定的东西、更改文件格式、使用压缩(。

如果你在解析器中花了很多时间,那么考虑一下,目前你分两次解析CSV文件的每一行:首先你拆分这一行(以一种不太好的方式(,将所有内容写入一个向量,然后解析向量的每个条目。这会导致大量不必要的内存分配。您可以使用_csv函数的更适合定制的版本,该版本使用std::from_chars进行解析并直接写入向量。

最新更新