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では、C ++ストリームではなく、win API関数を使用してファイル(CreateFile()、WriteFile()など)を操作することをお勧めします。それはわずかなパフォーマンスの向上をもたらすかもしれませんが、私は息を止めません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加