У меня есть относительно большой файл, который мне нужен, чтобы содержать только уникальные строки. Файл составляет всего 500 МБ. Я понимаю, что накладных расходов много, но я видел около 5 ГБ оперативной памяти. Я мог бы сделать это, используя внешнюю сортировку слияния и поддерживая небольшой объем оперативной памяти, но это выглядело быстрее, чем код.Почему unordered_set использует значительно больше ОЗУ, чем содержащиеся в нем данные?
Я использую 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;
}
В чем причина того, что оперативная память увеличится в 10 раз?
«* Файл всего 500 МБ.» «Вы говорите« только », как будто это небольшой файл. Кроме того, сколько строк в нем? –
Возможно, вы хотите посмотреть, что выделяется с помощью отладчика или анализатора памяти. – tadman
В конце 'read()', напечатайте 's.bucket_count()' и 's.size()'. Каковы значения? Вы можете захотеть 's.reserve (... нечто достаточно большое ...)', если требуется максимальная производительность. – doug65536