0

.csv からデータを読み取り、.csv ファイルを作成するプログラムがありますmultimap。以下に簡単なバージョンを貼り付けました。それは正常に動作しますが、終了時に非常にゆっくりと実行されます (つまり、プログラムが出力を出力してreturn 0;. 、ファイルサイズに比例します。

出口をスピードアップする方法があるかどうか疑問に思っていますか?メモリからデータを消去しているため、遅いと思います。 CTRL+cただし、ターミナルウィンドウですぐにシャットダウンします。私は見ましたが、あまり見つかりませんでした。

#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <vector>
#include <map>

int main (int argc, char* argv[])
{

std::string filename = "edge_data_mid.csv";

// obtain multimaps
std::ifstream fin;

fin.open(filename.c_str(), std::ios_base::in|std::ios_base::binary);
if (!fin.is_open()) {
    std::cout << "could not open the file '" << filename << "'" << std::endl;
    exit(EXIT_FAILURE);
}

std::multimap<std::string, std::string> gciting;

std::string line;

// this loop parses the file one line at a time
while (getline(fin, line)) {
    std::istringstream linestream(line);
    std::string item;

    std::string nodea;
    std::string nodeb;

    getline(linestream, item, ',');
    nodea = item;
    getline(linestream, item);
    nodeb = item;

    gciting.insert(std::pair<std::string, std::string>(nodeb, nodea));
}

fin.close();       

std::cout << gciting.count("3800035") << std::endl;

return 0;
}
4

2 に答える 2

5

はい、stdコンテナのデストラクタは、メモリを管理し(あなたの場合、std::string含まれる s のメモリを管理します)、多くの要素が含まれている場合、しばらく時間がかかります。

メモリ リークが気にならない場合 (これは、継続的にリークしておらず、制御されているため、言うまでもなくリークではありません)、マップを動的に割り当てて、それを削除するのを忘れることができます。

std::multimap<std::string, std::string>* gciting = new std::multimap<std::string, std::string>;

std::string line;

// this loop parses the file one line at a time
while (getline(fin, line)) {
    std::istringstream linestream(line);
    std::string item;

    std::string nodea;
    std::string nodeb;

    getline(linestream, item, ',');
    nodea = item;
    getline(linestream, item);
    nodeb = item;

    gciting->insert(std::pair<std::string, std::string>(nodeb, nodea));
}

fin.close();       

std::cout << gciting->count("3800035") << std::endl;

//oooops forgot to delte gciting
return 0;
}
于 2012-07-18T22:20:33.560 に答える
5

オブジェクトが破壊されないようにするにはどうすればよいですか?

オブジェクトがそれ自体の割り当てを解除するのを本当に止めたい場合、それに要素が含まれている場合 (アプリケーションが終了することがわかっているため) を使用してヒープに割り当てnew、メモリを解放しないでください (通常は を介し​​て行われますdelete)。

これは通常は推奨されませんが、今日の主要なオペレーティング システムは、アプリケーションの終了時に割り当てられたメモリを解放して OS に戻すことができるほどスマートであるため、このアプローチを使用することで安全を確保できます。


上記で「意志」ではなく「すべき」という言葉を使用したことに注意してください

標準には、割り当てられたメモリが OS に解放される、または解放しないとどうなるか (リークがあること以外) は何もありません。

マイナー システム (冷蔵庫のコントローラーなど) で実行するコードを作成している場合は、このプラットフォームが終了後に実際にメモリを解放することを実際に確認する前に、このアプローチを使用しないでください。

私たちは食べ物を悪くしたくありません


メモリの割り当て解除以外に遅くなる潜在的な理由

アプリケーションをデバッグ モードで実行している場合、アプリケーションの最終的なデバッグを支援するために、必要以上の処理が行われます。

最適化フラグをオンにして、(通常はリリース モードと呼ばれるもの) でコンパイルしてみてください。


プレースメント new..

何らかの理由でオブジェクトをスタックに常駐させたい場合は、以下のスニペットのように、placement-newを使用できます。placement-newは、渡されたアドレスを利用して、そこにオブジェクトを配置しようとします。

#include <type_traits>

typedef std::multimap<std::string,std::string> SSMap;

std::aligned_storage<
  sizeof(SSMap), std::alignment_of<SSMap>::value
>::type storage;

SSMap& gciting = * new (&storage) SSMap;

/* use gciting exactly as before */

C++03 では、適切なアラインメントを確保するための最良/最も簡単な方法は、使用malloc可能な最も厳密なアラインメント (すべての型で機能する) を満たすメモリを割り当てることです。

これにより、オブジェクトをスタックに常駐させる簡単な方法はありませんが、オブジェクトを使用するインターフェイスは同じままですが、ヒープに常駐するオブジェクトへの参照を作成することはできます。

#include <cstdlib>
typedef std::multimap<std::string,std::string> SSMap;

char * storage = static_cast<char*> (std::malloc (sizeof (SSMap))); 
SSMap& gciting = *new (storage) SSMap;

/* use gciting exactly as before */
于 2012-07-18T22:21:44.847 に答える