我想知道从 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/