gpt4 book ai didi

c++ - CSV 解析器的性能瓶颈

转载 作者:太空宇宙 更新时间:2023-11-04 14:55:36 25 4
gpt4 key购买 nike

下面给出了我当前的解析器 - 读取 ~10MB CSV 到 STL vector 需要 ~30 秒,这对我来说太慢了,因为我有超过 100MB 需要在每次程序运行时读取。谁能提供一些关于如何提高性能的建议?的确,在纯 C 中它会更快吗?

int main() {
std::vector<double> data;
std::ifstream infile( "data.csv" );
infile >> data;
std::cin.get();
return 0;
}

std::istream& operator >> (std::istream& ins, std::vector<double>& data)
{
data.clear();

// Reserve data vector
std::string line, field;
std::getline(ins, line);
std::stringstream ssl(line), ssf;

std::size_t rows = 1, cols = 0;
while (std::getline(ssl, field, ',')) cols++;
while (std::getline(ins, line)) rows++;

std::cout << rows << " x " << cols << "\n";

ins.clear(); // clear bad state after eof
ins.seekg(0);

data.reserve(rows*cols);

// Populate data
double f = 0.0;
while (std::getline(ins, line)) {
ssl.str(line);
ssl.clear();
while (std::getline(ssl, field, ',')) {
ssf.str(field);
ssf.clear();
ssf >> f;
data.push_back(f);
}
}
return ins;
}

注意:我也有 openMP 可供使用,内容最终将用于 CUDA 的 GPGPU 计算。

最佳答案

您可以通过一次而不是两次读取文件来节省一半的时间。

虽然预先调整 vector 的大小是有益的,但它永远不会支配运行时间,因为 I/O 总是会慢一些。

另一个可能的优化是在没有字符串流的情况下读取。类似(未经测试)

int c = 0;
while (ins >> f) {
data.push_back(f);
if (++c < cols) {
char comma;
ins >> comma; // skip comma
} else {
c = 0; // end of line, start next line
}
}

如果你可以省略 , 并且只用空格分隔值,它可能是均匀的

while (ins >> f)
data.push_back(f);

std::copy(std::istream_iterator<double>(ins), std::istream_iterator<double>(),
std::back_inserter(data));

关于c++ - CSV 解析器的性能瓶颈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16289065/

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