私は比較的大きなファイルを持っています。ファイルはわずか500MBです。私はオーバーヘッドがたくさんあることを理解していますが、私は約5GBのRAM使用量を見ていました。私はこれを外部のマージソートを使って実行し、少量のRAMを維持することができましたが、これはコードの方が速いようでした。なぜunordered_setは、それに含まれるデータよりも大幅にRAMを使用していますか?
私はVC++ 14を使用しています。
#include <string>
#include <vector>
#include <fstream>
#include <iostream>
#include <algorithm>
#include <unordered_set>
using std::vector;
using std::string;
using std::unordered_set;
class uniqify {
unordered_set<string> s;
public:
auto exists(const string &filename) const -> bool {
std::ifstream fin(filename);
bool good = fin.good();
return fin.close(), good;
}
void read(const string &filename) {
std::ifstream input(filename);
string line;
while (std::getline(input, line))
if (line.size())
s.insert(line);
}
void write(const string &filename) const {
std::ofstream fout(filename);
for (auto line : s)
fout << line << "\n";
fout.close();
}
};
int main(int argc, char **argv) {
uniqify u;
string file("file.txt");
if(u.exists(file))
u.read(file);
u.write("output_file.txt");
return 0;
}
なぜRAMが10倍以上急増するのでしょうか?
"ファイルは500MBだけです*"これは小さなファイルであるかのように "あなただけ"と言っています。また、そこには何本の線がありますか? –
デバッガまたはメモリアナライザを使用して割り当てられているものを調べることができます。 – tadman
'read()'の最後に 's.bucket_count()'と 's.size()'を表示します。値は何ですか?もし最大限の性能が望まれれば、 's.reserve(...何か十分な大きさ...)をしたいかもしれません。 – doug65536