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

标签 c++ performance csv serialization

我有一个这样的大型 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/

相关文章:

c++ - 为什么我指向 std::vector 元素的指针在 push_back() 之后改变了它的值?

c++ - 预定义的宏来识别调用函数?

ruby-on-rails - 加快验收测试中回形针的图像处理

sql - 对于非常复杂的报告,人们有时会使用他们的语言而不是 sql 进行编码吗?

java - 如何从 CSV 文件的某些字段创建 h2 数据库

c++ - 二维数组作为默认构造函数参数 C++

c++ - 如何在 C++ 中将当前时间简洁地添加到字符串中?

MySQL Load data infile -- 双引号中的双引号值如 "a "double"quoted value"

sql - 临时表和 SQL SELECT 性能

shell - 创建一个 shell 脚本以在 mongodb 中自动导出 csv