超大文件的 stxxl 排序 (ubuntu)
stxxl sorting of very large file (ubuntu)
我正在尝试对包含大约十亿条记录(每条记录包含四个整数)的大文件进行排序。文件的大小将超过 50GB。
我正在用 4 亿条记录(大约 6 GB 文件)测试我的代码。我的磁盘配置如下所示:
disk=/var/tmp/stxxl,50G,syscall delete
我的机器有 16 GB RAM 和 8 个物理处理器(Intel i7),stxxl 版本 1.4.1。如果我运行 2亿条记录的代码,大概需要5分钟。但是当我运行有4亿条记录的代码时,它似乎运行ning out disk space。我的问题是:
1) 为什么我的代码 运行 宁用磁盘 space 来排序一个 6 GB 的文件?请审阅(仅附上几行重要内容)。
2) 我的 PC 整理 2 亿条记录需要 5 分钟的合理时间吗?如果是真的,不知道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;
...
}
如果您只想排序,请考虑使用 stxxl::sorter。
它应该只需要预期的磁盘数量 space,数据的总大小,并且应该至少使用 ~100 MB/s 进行排序,具体取决于您的磁盘和方式复杂的比较是相对于数据类型的大小。
stxxl::sort() 函数做更多的工作,需要额外的 space,因为它会写入临时的额外数据。
另见我的教程视频:)。
我正在尝试对包含大约十亿条记录(每条记录包含四个整数)的大文件进行排序。文件的大小将超过 50GB。
我正在用 4 亿条记录(大约 6 GB 文件)测试我的代码。我的磁盘配置如下所示:
disk=/var/tmp/stxxl,50G,syscall delete
我的机器有 16 GB RAM 和 8 个物理处理器(Intel i7),stxxl 版本 1.4.1。如果我运行 2亿条记录的代码,大概需要5分钟。但是当我运行有4亿条记录的代码时,它似乎运行ning out disk space。我的问题是:
1) 为什么我的代码 运行 宁用磁盘 space 来排序一个 6 GB 的文件?请审阅(仅附上几行重要内容)。
2) 我的 PC 整理 2 亿条记录需要 5 分钟的合理时间吗?如果是真的,不知道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;
...
}
如果您只想排序,请考虑使用 stxxl::sorter。
它应该只需要预期的磁盘数量 space,数据的总大小,并且应该至少使用 ~100 MB/s 进行排序,具体取决于您的磁盘和方式复杂的比较是相对于数据类型的大小。
stxxl::sort() 函数做更多的工作,需要额外的 space,因为它会写入临时的额外数据。
另见我的教程视频:)。