Итак, это немного отличается от других ответов. Я не могу сказать, что компилятор C ++ - это в точности «инструмент Linux CLI», но запуск g++ -O3 -march=native -o set_diff main.cpp
(с приведенным ниже кодом в main.cpp
может помочь):
#include<algorithm>
#include<iostream>
#include<iterator>
#include<fstream>
#include<string>
#include<unordered_set>
using namespace std;
int main(int argc, char** argv) {
ifstream keep_file(argv[1]), del_file(argv[2]);
unordered_multiset<string> init_lines{istream_iterator<string>(keep_file), istream_iterator<string>()};
string line;
while (getline(del_file, line)) {
init_lines.erase(line);
}
copy(init_lines.begin(),init_lines.end(), ostream_iterator<string>(cout, "\n"));
}
Чтобы использовать, просто запустите set_diff B A
( не A B
, поскольку B
равно nodes_to_keep
), и полученная разница будет напечатана на стандартный вывод.
Обратите внимание, что я отказался от нескольких лучших практик C ++, чтобы сделать код проще.
Можно выполнить много дополнительных оптимизаций скорости (за счет увеличения объема памяти). mmap
также был бы особенно полезен для больших наборов данных, но это сделало бы код намного более сложным.
Поскольку вы упомянули, что наборы данных большие, я подумал, что чтение nodes_to_delete
строки за раз может быть хорошей идеей для сокращения потребления памяти. Подход, использованный в приведенном выше коде, не особенно эффективен, если в вашем nodes_to_delete
много дураков. Также порядок не сохранился.
<Ч />
Что-то проще скопировать и вставить в bash
(т.е. пропустить создание main.cpp
):
g++ -O3 -march=native -xc++ -o set_diff - <<EOF
#include<algorithm>
#include<iostream>
#include<iterator>
#include<fstream>
#include<string>
#include<unordered_set>
using namespace std;
int main(int argc, char** argv) {
ifstream keep_file(argv[1]), del_file(argv[2]);
unordered_multiset<string> init_lines{istream_iterator<string>(keep_file), istream_iterator<string>()};
string line;
while (getline(del_file, line)) {
init_lines.erase(line);
}
copy(init_lines.begin(),init_lines.end(), ostream_iterator<string>(cout, "\n"));
}
EOF