C ++ベクターからテキストファイルへのデータの高速書き込み

vincent911001

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]

編集
0

コメントを追加

0

関連記事

分類Dev

C#テキストファイルへのデータの書き込み

分類Dev

テキストボックスからテキストファイルへの書き込みC#

分類Dev

C ++のバイナリファイルへのデータの大きなベクトルの書き込み/読み取り

分類Dev

ストアドプロシージャから.dbfファイルへのデータの書き込み、c#

分類Dev

データの取得とファイルc ++への書き込み

分類Dev

テキストファイルからベクターc ++への単語の追加

分類Dev

不規則なテキストファイルからC ++のクラスへのデータの読み取り

分類Dev

テキストファイルへの書き込みとテキストファイルからの読み取り-C#WindowsユニバーサルプラットフォームアプリWindows 10

分類Dev

C#-リストボックスからテキストファイルのデータを上書きするのに問題があります

分類Dev

テキストファイルへのC#書き込みの問題

分類Dev

スペースで区切られたデータを読み取り、配列に保存してから、C ++の新しいテキストファイルに別の順序で書き込む方法

分類Dev

excelsheetファイルからmysqlデータベースC#へのデータのインポート

分類Dev

テキストファイルからさまざまなデータ型の構造体にデータを読み込むc#

分類Dev

C#からSQLデータベースへの数値の書き込みに問題がある

分類Dev

バイトのファイルベクトルへのC ++書き込み

分類Dev

ファイルからCの構造体にデータを書き込む

分類Dev

C ++のテキストファイルからの構造体の読み取り/書き込み

分類Dev

C ++ファイルストリームへの「ビット」の書き込み

分類Dev

Cのファイル、ポインターへのアクセス、ファイルの読み取りと書き込み

分類Dev

ファイルからベクターへのC ++の読み取り

分類Dev

ファイルからベクターC ++への関数の読み取り

分類Dev

ファイルユーザーデータへのC#プログラミング書き込み

分類Dev

C:サイズ不明のテキストファイルからintデータのみを入力する方法

分類Dev

C#-テキストファイルからデータベースに最初の列を挿入します

分類Dev

C ++でのファイルストリームへの/からのバイナリバイト/ ints / longsの書き込み/読み取り

分類Dev

キューc ++へのベクターの保存と書き込み

分類Dev

Windowsからテキストファイルを読み取り、CでLinuxサーバーに書き込む

分類Dev

C#のテキストファイルに文字列データのバイト形式を書き込む際の問題

分類Dev

Cのテキストファイルから16進データを読み取る方法

Related 関連記事

  1. 1

    C#テキストファイルへのデータの書き込み

  2. 2

    テキストボックスからテキストファイルへの書き込みC#

  3. 3

    C ++のバイナリファイルへのデータの大きなベクトルの書き込み/読み取り

  4. 4

    ストアドプロシージャから.dbfファイルへのデータの書き込み、c#

  5. 5

    データの取得とファイルc ++への書き込み

  6. 6

    テキストファイルからベクターc ++への単語の追加

  7. 7

    不規則なテキストファイルからC ++のクラスへのデータの読み取り

  8. 8

    テキストファイルへの書き込みとテキストファイルからの読み取り-C#WindowsユニバーサルプラットフォームアプリWindows 10

  9. 9

    C#-リストボックスからテキストファイルのデータを上書きするのに問題があります

  10. 10

    テキストファイルへのC#書き込みの問題

  11. 11

    スペースで区切られたデータを読み取り、配列に保存してから、C ++の新しいテキストファイルに別の順序で書き込む方法

  12. 12

    excelsheetファイルからmysqlデータベースC#へのデータのインポート

  13. 13

    テキストファイルからさまざまなデータ型の構造体にデータを読み込むc#

  14. 14

    C#からSQLデータベースへの数値の書き込みに問題がある

  15. 15

    バイトのファイルベクトルへのC ++書き込み

  16. 16

    ファイルからCの構造体にデータを書き込む

  17. 17

    C ++のテキストファイルからの構造体の読み取り/書き込み

  18. 18

    C ++ファイルストリームへの「ビット」の書き込み

  19. 19

    Cのファイル、ポインターへのアクセス、ファイルの読み取りと書き込み

  20. 20

    ファイルからベクターへのC ++の読み取り

  21. 21

    ファイルからベクターC ++への関数の読み取り

  22. 22

    ファイルユーザーデータへのC#プログラミング書き込み

  23. 23

    C:サイズ不明のテキストファイルからintデータのみを入力する方法

  24. 24

    C#-テキストファイルからデータベースに最初の列を挿入します

  25. 25

    C ++でのファイルストリームへの/からのバイナリバイト/ ints / longsの書き込み/読み取り

  26. 26

    キューc ++へのベクターの保存と書き込み

  27. 27

    Windowsからテキストファイルを読み取り、CでLinuxサーバーに書き込む

  28. 28

    C#のテキストファイルに文字列データのバイト形式を書き込む際の問題

  29. 29

    Cのテキストファイルから16進データを読み取る方法

ホットタグ

アーカイブ