Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将巨大的2D向量写入文本文件太慢,如何提高性能?_C++_Vector_Ofstream - Fatal编程技术网

C++ 将巨大的2D向量写入文本文件太慢,如何提高性能?

C++ 将巨大的2D向量写入文本文件太慢,如何提高性能?,c++,vector,ofstream,C++,Vector,Ofstream,我有10个大的(3400万个单元)2D网格向量存储双精度。写入时,它们的大小超过200 mb。我使用ofstream对象将它们写入文本文件(csv格式),一次一个元素,使用两个for循环(一个用于行,一个用于列)。他们花了很长的时间来写作。有没有更快的方法从这些向量中写入 这是我的密码: // Resizing of vectors flowDirGrid.resize(rows, std::vector<double>(cols, NODATA)); // Do some pro

我有10个大的(3400万个单元)2D网格向量存储双精度。写入时,它们的大小超过200 mb。我使用ofstream对象将它们写入文本文件(csv格式),一次一个元素,使用两个for循环(一个用于行,一个用于列)。他们花了很长的时间来写作。有没有更快的方法从这些向量中写入

这是我的密码:

// Resizing of vectors
flowDirGrid.resize(rows, std::vector<double>(cols, NODATA));

// Do some processing
....

// Outputting processed data
ofstream outfile3("FlowDir.dat");
if(!outfile3.good())
    return;

for(int i=0; i<rows; i++)        
    {
        for (int j=0; j<cols; j++)
        {
            if(elevation[i][j]!=NODATA)
                outfile3 << flowDirGrid[i][j]<<" ";
            else
                outfile3 << NODATA<<" ";
        }
        outfile3 << std::endl;
    }

outfile3.close(); 
//调整向量大小
resize(行,标准::向量(cols,NODATA));
//做一些处理
....
//输出处理后的数据
流出管3的流量(“流量方向数据”);
如果(!outfile3.good())
返回;

对于(int i=0;i根据
std::endl
导致刷新流。尝试使用
\n
代替。

根据
std::endl
导致刷新流。尝试使用
\n
代替。

根据
std::endl
导致刷新流。尝试使用
\n
代替。

DE> STD::EntL\/Cult>导致流的泛滥。尝试使用<代码> \n>代码>。

< p> C++的IoScript库非常方便,但非常慢。<代码> fPrtuff < /C>会更好地使用。此外,使用“\n”代替“代码> EntL\/Cuffe >,因为后者迫使流刷新。


#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
使用名称空间std::chrono;
void PrintC(常数双*数据、大小、常数字符*路径)
{
文件*f=fopen(路径,“w”);
对于(尺寸i(0);i!=n;++i)
fprintf(f,“%lf”,数据[i]);
fclose(f);
}
void PrintCpp(常数双*数据、大小、常数字符*路径)
{
流f(路径);
对于(尺寸i(0);i!=n;++i)

F

C++ C++流库非常方便,但是非常慢。<代码> fPrtufF会更好地使用。此外,使用“\n”代替“代码> EntL\/Cuffe >,因为后者迫使流刷新。


#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
使用名称空间std::chrono;
void PrintC(常数双*数据、大小、常数字符*路径)
{
文件*f=fopen(路径,“w”);
对于(尺寸i(0);i!=n;++i)
fprintf(f,“%lf”,数据[i]);
fclose(f);
}
void PrintCpp(常数双*数据、大小、常数字符*路径)
{
流f(路径);
对于(尺寸i(0);i!=n;++i)

F

C++ C++流库非常方便,但是非常慢。<代码> fPrtufF会更好地使用。此外,使用“\n”代替“代码> EntL\/Cuffe >,因为后者迫使流刷新。


#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
使用名称空间std::chrono;
void PrintC(常数双*数据、大小、常数字符*路径)
{
文件*f=fopen(路径,“w”);
对于(尺寸i(0);i!=n;++i)
fprintf(f,“%lf”,数据[i]);
fclose(f);
}
void PrintCpp(常数双*数据、大小、常数字符*路径)
{
流f(路径);
对于(尺寸i(0);i!=n;++i)

F

C++ C++流库非常方便,但是非常慢。<代码> fPrtufF会更好地使用。此外,使用“\n”代替“代码> EntL\/Cuffe >,因为后者迫使流刷新。


#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
使用名称空间std::chrono;
void PrintC(常数双*数据、大小、常数字符*路径)
{
文件*f=fopen(路径,“w”);
对于(尺寸i(0);i!=n;++i)
fprintf(f,“%lf”,数据[i]);
fclose(f);
}
void PrintCpp(常数双*数据、大小、常数字符*路径)
{
流f(路径);
对于(尺寸i(0);i!=n;++i)

200 MB的20分钟似乎很长。您有一个性能问题,因此必须按顺序测试元素

  • 使用一个200 mb的磁盘并复制它(直接在操作系统级别)。如果需要大约10分钟,瓶颈就在这里:购买一个更快的磁盘

  • 制作一个生成随机值集的测试程序(不是全部0,因为0比其他双精度值容易转换,所以只需*不同的值),写入时间(至少包括秒)使用上述代码写入文件并再次写入时间-或者,您可以使用当前代码只添加两次。运行几次。如果所需时间明显长于第一次测试,请在此处报告第一次测试和第二次测试的时间

  • 如果上面的测试都没有花费大约10分钟,那么问题就出在剩下的代码中


  • 200 MB的20分钟似乎很长。您有性能问题,因此必须按顺序测试元素

  • 使用一个200 mb的磁盘并复制它(直接在操作系统级别)。如果需要大约10分钟,瓶颈就在这里:购买一个更快的磁盘

  • 制作一个生成随机值集的测试程序(不是全部0,因为0比其他双精度值容易转换,所以只需*不同的值),写入时间(至少包括秒)使用上述代码写入文件并再次写入时间-或者,您可以使用当前代码只添加两次。运行几次。如果所需时间明显长于第一次测试,请在此处报告第一次测试和第二次测试的时间

  • 如果上面的测试都没有花费大约10分钟,那么问题就出在剩下的代码中


  • 200 MB的20分钟似乎很长。您有性能问题,因此必须按顺序测试元素

  • 使用一个200 mb的磁盘并复制它(直接在操作系统级别)。如果需要大约10分钟,瓶颈就在这里:购买一个更快的磁盘

  • 制作一个生成随机值集的测试程序(不是全部0,因为0比其他双精度值容易转换,所以只需*不同的值),写入时间(至少包括秒)使用上面的代码编写文件并再次写入时间-或者,您可以使用当前代码只添加两次。运行几次。如果所需时间明显长于第一次测试,请在此处报告
    #include <cstdio>
    #include <chrono>
    #include <fstream>
    #include <iostream>
    #include <random>
    #include <vector>
    
    using namespace std;
    using namespace std::chrono;
    
    void PrintC(const double * data, size_t n, const char * path)
    {
        FILE * f = fopen(path, "w");
        for (size_t i(0); i != n; ++i)
            fprintf(f, "%lf ", data[i]);
        fclose(f);
    }
    
    void PrintCpp(const double * data, size_t n, const char * path)
    {
        ofstream f(path);
        for (size_t i(0); i != n; ++i)
            f << data[i] << ' ';
    }
    
    template<typename PrintT>
    void Time(const vector<double> & data, PrintT Print, const char * path, const char * text)
    {
        auto s = steady_clock::now();
        Print(data.data(), data.size(), path);
        auto f = steady_clock::now();
    
        cout << text << ": " << duration_cast<duration<double>>(f - s).count() << endl;
    }
    
    int main()
    {
        vector<double> data(34000000);
        default_random_engine generator;
        uniform_real_distribution<double> distribution(0.0, 1.0);
        for (size_t i(0); i != data.size(); ++i)
            data[i] = distribution(generator);
    
        Time(data, PrintC,   "test1.dat", "c");
        Time(data, PrintCpp, "test2.dat", "c++");
    }