【问题标题】:stxxl sorting of very large file (ubuntu)stxxl 对非常大的文件进行排序(ubuntu)
【发布时间】:2015-01-14 04:05:23
【问题描述】:

我正在尝试对一个包含大约十亿条记录(每条记录包含四个整数)的大文件进行排序。文件的大小将超过 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 分钟是我的 PC 对 2 亿条记录进行排序的合理时间吗?如果是真的,我想知道stxxl是否可以在白天对50亿条记录进行排序。

3) 你认为 stxxl 是解决这类问题的好选择吗?我也可以访问安装了 mpi 的集群。

代码(灵感来自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;
  ...
}

【问题讨论】:

    标签: stxxl external-sorting


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的建议。在进行您提到的更改并使用stxxl::sorter 后,我的代码能够对 56 亿个元组(大约 82 GB 文件)进行排序,并在大约 260 分钟内保存结果。 [2.0 GHz 8 核 Intel E5 2650,顺序磁盘存储]。比较函数是C++中默认的元组比较。
    猜你喜欢
    • 2011-12-16
    • 1970-01-01
    • 2018-07-22
    • 2010-10-30
    • 2015-02-27
    • 2013-01-04
    • 2018-11-11
    • 2013-05-15
    相关资源
    最近更新 更多