我试图对一个包含大约10亿条记录的大型文件进行排序(每个记录包含四个整数)。文件的大小将超过50 up。
我正在用4亿条记录(大约6 GB文件)测试我的代码。我的磁盘配置如下所示:
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启发):
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;
...
}发布于 2015-01-14 22:21:55
如果只想排序,可以考虑使用stxxl::sorter。
它应该只需要预期的磁盘空间数量、数据的总大小,并且应该以至少100 MB/s的速度进行排序,这取决于磁盘的大小以及相对于数据类型大小的比较有多复杂。
因为stxxl::sort()函数会编写临时额外的数据,因此它会做更多的工作,并需要额外的空间。
也请看我的教程视频:)。
https://stackoverflow.com/questions/27935683
复制相似问题