C++ 将巨大的2D向量写入文本文件太慢,如何提高性能?
我有10个大的(3400万个单元)2D网格向量存储双精度。写入时,它们的大小超过200 mb。我使用ofstream对象将它们写入文本文件(csv格式),一次一个元素,使用两个for循环(一个用于行,一个用于列)。他们花了很长的时间来写作。有没有更快的方法从这些向量中写入 这是我的密码: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
// 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++");
}