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