快速将C ++ Vector中的数据写入文本文件

时间:2015-04-20 07:30:46

标签: c++ file-io

我想知道将数据从vector<string>快速写入文本文件的最佳方法,因为数据将涉及数百万行。

我在C ++和fprintf中尝试过使用C的ofstream(&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;

vector<string> OBJdata;

OBJdata = assembleOBJ(pointer, vertexCount, facePointer);

FILE * objOutput;
objOutput = fopen("sample.obj", "wt");
for (int i = 0; i < OBJdata.size(); i++)
{
    fwrite(&OBJdata[i],1, sizeof(OBJdata[i].length()),objOutput );
}
fclose(objOutput);

2 个答案:

答案 0 :(得分:4)

没有最好的&#34;。只有不同优点和缺点的选项,两者都随主机硬件而变化(例如,写入高性能驱动器将比慢速驱动器更快),文件系统和设备驱动程序(磁盘驱动程序的实现可以权衡性能增加数据正确写入驱动器的机会。)

但是,通常,在内存中操作数据比将数据传输到硬盘驱动器等设备或从硬盘驱动器上传输数据要快。对此有一些限制,因为对于虚拟内存,物理内存中的数据可能会在某些情况下传输到虚拟内存 - 磁盘上。

因此,假设您有足够的RAM和快速的CPU,那么就像

这样的方法
 // assume your_stream is an object of type derived from ostream

 //   THRESHOLD is a large-ish positive integer

std::string buffer;
buffer.reserve(THRESHOLD);
for (std::vector<string>::const_iterator i = yourvec.begin(), end = yourvec.end(); i != end; ++i)
{
     if (buffer.length() + i->length + 1 >= THRESHOLD)
     {
          your_stream << buffer;
          buffer.resize(0);
     }
     buffer.append(*i);
     buffer.append(1, '\n');
}
your_stream << buffer;

此处的策略是减少写入流的不同操作的数量。根据经验,较大的THRESHOLD值将减少不同输出操作的数量,但也会消耗更多内存,因此在性能方面通常存在一个最佳位置。问题是,最佳位置取决于我上面提到的因素(硬件,文件系统,设备驱动程序等)。因此,只有当您知道程序将运行的确切硬件和主机系统配置时(或者您知道程序将仅在少量配置中执行),这种方法值得花些精力才能找到最佳位置。如果您不了解这些内容,那么这项工作是不值得的,因为使用一种配置的功能通常不适用于另一种配置。

在Windows下,您可能希望使用win API函数来处理文件(CreateFile(),WriteFile()等)而不是C ++流。这可能会带来很小的性能提升,但我不会屏住呼吸。

答案 1 :(得分:0)

您可能需要查看允许您一次编写多个元素的writev - 从而更好地利用缓冲。请参阅:http://linux.die.net/man/2/writev