【问题标题】:std::fstream taking very long time to write large data into .csv file [closed]std::fstream 需要很长时间才能将大数据写入 .csv 文件 [关闭]
【发布时间】:2019-08-16 14:37:22
【问题描述】:

我正在尝试将大数据写入 csv 文件,我正在处理的行数以百万为单位。

我的代码以双精度数组的形式生成行。该代码需要很长时间才能将数据写入文件(比在同一台机器上使用 10k 批量插入将相同数量的记录写入数据库的时间翻倍)。

我已经尝试缓冲 std::string 中的 10000 和 100000 行,但仍然很慢。

HRESULT FastLoad::Insert()
{
    for (int i = 1; i <= m_iCsvColumnCount; i++)  // m_iCsvColumnCount is actual number of columns 1 to n
    {
        if (arrayOfRowVals[i] != NULL_NUM)    // arrayOfRowVals is array of double 
        m_Csvfile << arrayOfRowVals[i];       // std::fstream  m_Csvfile.open("/install/FactPOC/Fact.csv", std::ios_base::out | std::ios_base::app);

        if (i < m_iCsvColumnCount)
        {
            m_Csvfile << ",";
        }
    }
    m_Csvfile << "\n";

    return 0;
}

【问题讨论】:

  • for (int i = 1; i &lt;= m_nColumnCount; i++) 可能是 1 个错误。 c++ 中的数组的索引为 0 .. size -1
  • 直接写入文件,而不是为整行创建一个字符串然后再写入。
  • 除非您正在执行一些时髦的处理(您不是),否则将数据直接写入文件而不是写入缓冲区然后输出缓冲区通常更简单且更快。大多数输出​​流都有自己的缓冲,而且很可能是在了解实现(编译器、可能的主机等)的情况下设计的。此外,C++ 中的数组索引是从零开始的,因此您可能会遇到一个错误,给出未定义的行为 - 这可以通过多种方式表现出来,包括奇怪的性能问题。
  • 对于代码审查,您可能宁愿尝试codereview.stackexchange.com。只要确保在那里发布正确和完整的代码
  • 您还可以使用多个缓冲区和线程。一个线程写入缓冲区并将其填满。它开始填充第二个缓冲区。输出线程开始写入第一个缓冲区,然后将写入第二个缓冲区。使用尽可能多的缓冲区来调整时间。

标签: c++ c++11 io


【解决方案1】:

您一遍又一遍地打开文件。那一定很慢!!

相反,打开它一次。为函数提供对您的 ifstream 的引用,以便它可以重复使用。

并删除缓冲。在你和文件系统之间已经有很多现有的更好的缓冲层了。

【讨论】:

  • 刚刚按你说的试了一下,去掉了重新打开和缓冲部分,但现在比以前需要更多的时间。看来我需要以其他有效的方式缓冲数据。
  • 您是否正在构建启用了优化的发布可执行文件?
  • 这没有意义。
  • @drescherjm 是的,我正在使用 -O2 选项。
猜你喜欢
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多