我正在尝试对具有约十亿条记录(每个包含四个整数)的大文件进行排序。文件大小将超过50GB。

我正在测试4亿条记录(约6 GB文件)的代码。我的磁盘配置如下所示:

disk=/var/tmp/stxxl,50G,syscall delete

我的机器具有16 GB RAM,并具有stxxl版本1.4.1的8个物理处理器(Intel i7)。如果我运行具有2亿条记录的代码,则大约需要5分钟。但是,当我运行具有4亿条记录的代码时,似乎磁盘空间不足。我的问题是:

1)为什么我的代码用尽了磁盘空间来排序6 GB的文件?请仔细检查(仅附上几行)。

2)5分钟是我的PC整理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);

每个 vector 元素或记录都是四个无符号数字的元组:
struct my_type
{
  typedef unsigned short key_type;
  typedef std::tuple<key_type, key_type, key_type, key_type> key4tuple;
  ...
}

最佳答案

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

它应该只需要预期的磁盘空间量,数据的总大小,并且排序速度至少应为〜100 MB / s,这取决于您的磁盘以及与数据类型大小相关的比较复杂程度。

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

另请参阅我的教学视频:)。

关于stxxl - 大型文件的stxxl排序(ubuntu),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27935683/

10-08 22:36