gpt4 book ai didi

c++ - 在 C++ 中从 CSV 获取数据的最快方法

转载 作者:可可西里 更新时间:2023-11-01 18:36:55 27 4
gpt4 key购买 nike

我有一个这样的大型 CSV(大约 75 MB):

1,2,4
5,2,0
1,6,3
8,3,1
...

我用这段代码存储我的数据:

#include <sstream>
#include <fstream>
#include <vector>

int main()
{
char c; // to eat the commas

int x, y, z;
std::vector<int> xv, yv, zv;

std::ifstream file("data.csv");
std::string line;

while (std::getline(file, line)) {
std::istringstream ss(line);
ss >> x >> c >> y >> c >> z;
xv.push_back(x);
yv.push_back(y);
zv.push_back(z);
}

return 0;
}

我花了这个大的 CSV (~75MB):

real        0m7.389s
user 0m7.232s
sys 0m0.132s

这么多!

最近,使用 Sublime Text 的一个片段,我找到了另一种读取文件的方法:

#include <iostream>
#include <vector>
#include <cstdio>

int main()
{
std::vector<char> v;

if (FILE *fp = fopen("data.csv", "r")) {
char buf[1024];
while (size_t len = fread(buf, 1, sizeof(buf), fp))
v.insert(v.end(), buf, buf + len);
fclose(fp);
}
}

我在这个大 CSV (~75MB) 中(没有获取数据):

real        0m0.118s
user 0m0.036s
sys 0m0.080s

这在时间上有很大的不同!

问题是如何在字符 vector 中以更快的方式获取 3 个 vector 中的数据!我不知道如何才能比第一个提议更快。

非常感谢! ^^

最佳答案

当然你的第二个版本会快得多 - 它只是将文件读入内存,而不解析其中的值。使用 C 风格 I/O 的第一个版本的等价物是

if (FILE *fp = fopen("data.csv", "r")) {
while (fscanf(fp, "%d,%d,%d", &x, &y, &z) == 3) {
xv.push_back(x);
yv.push_back(y);
zv.push_back(z);
}
fclose(fp);
}

对我来说,这比 C++ 风格的版本快大约三倍。但是没有中间 stringstream

的 C++ 版本
while (file >> x >> c >> y >> c >> z) {
xv.push_back(x);
yv.push_back(y);
zv.push_back(z);
}

几乎一样快。

关于c++ - 在 C++ 中从 CSV 获取数据的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21778571/

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