我正在尝试对大型文件进行排序,其中包含大约十亿条记录(每条记录包含四个整数)。该文件的大小将超过50GB。
我正在使用4亿条记录(大约6 GB文件)测试我的代码。我的磁盘配置如下所示:
disk=/var/tmp/stxxl,50G,syscall delete
我的机器有16 GB RAM,有8个物理处理器(Intel i7),stxxl版本1.4.1。如果我运行2亿条记录的代码,大约需要5分钟。但是当我运行包含4亿条记录的代码时,它似乎耗尽了磁盘空间。我的问题是:
1)为什么我的代码用尽磁盘空间来排序甚至是6 GB的文件?请仔细阅读(仅附上几条重要的内容)。
2)我的电脑有5分钟合理的时间来分类2亿条记录吗?如果是真的,我想知道stxxl是否可以在白天对50亿条记录进行排序。
3)你认为stxxl是解决这类问题的不错选择吗?我也可以访问已安装mpi的集群。
CODE(灵感来自examples / algo / sort_file.cpp和examples / algo / phonebills.cpp):
size_t memory_to_use = (1*1024) * 1024 * 1024ul;
typedef stxxl::vector<my_type, 1, stxxl::lru_pager<8>, block_size> vector_type;
std::copy(std::istream_iterator<my_type>(in),
std::istream_iterator<my_type>(),
std::back_inserter(v));
stxxl::sort(v.begin(), v.end(), Cmp(), memory_to_use);
每个向量元素或记录是四个无符号数的元组:
struct my_type
{
typedef unsigned short key_type;
typedef std::tuple<key_type, key_type, key_type, key_type> key4tuple;
...
}
答案 0 :(得分:3)
如果您只想排序,请考虑使用stxxl :: sorter。
它应该只需要预期的磁盘空间量,数据的总大小,并且应该排序至少~100 MB / s,具体取决于您的磁盘以及相对于数据类型的复杂比较大小
stxxl :: sort()函数执行的工作更多,需要额外的空间,因为它会写入临时的额外数据。
另见我的教程视频:)。