c++ - 将数据从 C++ Vector 快速写入文本文件

标签 c++ file-io

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

我已经尝试过 C++ 中的 ofstream (<<) 以及使用 C 的 fprintf,但是,它们之间的性能很小,因为我已经记录了用于生成所需文件的时间。

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);

最佳答案

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

但是,一般来说,在内存中操作数据比将数据传入或传出硬盘等设备要快。这有一些限制,因为对于虚拟内存,物理内存中的数据在某些情况下可能会传输到磁盘上的虚拟内存。

因此,假设您有足够的 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++ 流。这可能会带来很小的性能提升,但我不会屏住呼吸。

关于c++ - 将数据从 C++ Vector 快速写入文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29741702/

相关文章:

c++ - 红黑树插入,我想我可能把旋转弄乱了

C++ 需要一种很好的技术来播种不使用 time() 的 rand()

perl - 如何正确处理Perl中的错误

c++ - 用 C 和 C++ 最快的输出到文件

java - 通过优化读取 N 行 - Java

c++ - 如何通过在逗号后打断来制作 clang 格式换行函数?

c++ - 在非透明父窗口之上创建透明子窗口 (win32)

Java FileOutputStream 创建文件未解锁

c++ - 打印数组是否溢出

windows - 如何找出在Windows中打开的EXE