所以,这与其他答案略有不同。我不能说 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