stxxl排序非常大的文件(ubuntu)

时间:2015-01-14 04:05:24

标签: stxxl external-sorting

我正在尝试对大型文件进行排序,其中包含大约十亿条记录(每条记录包含四个整数)。该文件的大小将超过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;
  ...
}

1 个答案:

答案 0 :(得分:3)

如果您只想排序,请考虑使用stxxl :: sorter。

它应该只需要预期的磁盘空间量,数据的总大小,并且应该排序至少~100 MB / s,具体取决于您的磁盘以及相对于数据类型的复杂比较大小

stxxl :: sort()函数执行的工作更多,需要额外的空间,因为它会写入临时的额外数据。

另见我的教程视频:)。