私はいくつかのプロジェクトに取り組んでおり、ファイルから膨大な量のデータを読み取るのに最も効率的な方法はどれか疑問に思っています (100 行から最大 30 億行のファイルについて話しています。 )。読み取られると、データは構造化されたデータ セットに格納されます ( vector<entry>
「エントリ」は構造化された行を定義します)。
このファイルの構造化された行は次のようになります:
string int int int string string
これも適切なプラットフォームで終わり、EOL
タブで区切られています
私が達成したいのは:
- ファイルをメモリに読み込む (
string
) またはvector<char>
- バッファから生データを読み取り、それをデータセットにフォーマットします。
メモリ フットプリントを考慮し、解析速度を速くする必要があります。stringstream
遅すぎるように見えるので、私はすでに の使用を避けています。
また、次を使用して、ファイルへの複数の I/O 呼び出しを回避しています。
// open the stream
std::ifstream is(filename);
// determine the file length
is.seekg(0, ios_base::end);
std::size_t size = is.tellg();
is.seekg(0, std::ios_base::beg);
// "out" can be a std::string or vector<char>
out.reserve(size / sizeof (char));
out.resize(size / sizeof (char), 0);
// load the data
is.read((char *) &out[0], size);
// close the file
is.close();
この巨大なstd::string
データを 1 行ずつループして、行情報 (文字列と整数部分) をデータ セットの行に抽出することを考えました。これを行うより良い方法はありますか?
編集 : このアプリケーションは、32 ビット、64 ビットのコンピューター、またはより大きなファイル用のスーパー コンピューターで実行できます。
どんな提案でも大歓迎です。
ありがとうございました