首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >超大型文件的stxxl排序(ubuntu)

超大型文件的stxxl排序(ubuntu)
EN

Stack Overflow用户
提问于 2015-01-14 04:05:23
回答 1查看 645关注 0票数 3

我试图对一个包含大约10亿条记录的大型文件进行排序(每个记录包含四个整数)。文件的大小将超过50 up。

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

代码语言:javascript
复制
disk=/var/tmp/stxxl,50G,syscall delete

我的机器有16 GB内存和8个物理处理器(Intel i7),stxxl版本为1.4.1。如果我运行有2亿条记录的代码,大约需要5分钟。但是当我用4亿条记录运行代码时,它似乎耗尽了磁盘空间。我的问题是:

1)为什么我的代码没有足够的磁盘空间来对6GB文件进行排序?请检查它(只附上几行重要的内容)。

2)我的个人电脑整理2亿条记录的合理时间是5分钟吗?如果是真的,我想知道stxxl是否能在白天对50亿条记录进行排序。

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

代码(受示例/algo/排序_file.cpp和实例/algo/phoneBills.cpp启发):

代码语言:javascript
复制
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);

每个向量元素或记录是由四个无符号数字组成的元组:

代码语言:javascript
复制
struct my_type
{
  typedef unsigned short key_type;
  typedef std::tuple<key_type, key_type, key_type, key_type> key4tuple;
  ...
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-14 22:21:55

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

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

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

也请看我的教程视频:)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27935683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档