我有一个很大的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的Snippet,我发现了另一种读取文件的方法:
#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
这是一个巨大的时间差异!
问题是如何在chars向量中以更快的方式获取3个向量中的数据!我不知道如何以比第一次提议更快的方式做到。
非常感谢! ^^
答案 0 :(得分:6)
当然你的第二个版本会快得多 - 它只是将文件读入内存,而不解析其中的值。使用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
while (file >> x >> c >> y >> c >> z) {
xv.push_back(x);
yv.push_back(y);
zv.push_back(z);
}
几乎一样快。
答案 1 :(得分:-1)
保存文件中写入了多少个数字。 然后,在加载时调整向量的大小。可以减少时间。