问题标签 [stxxl]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
258 浏览

sorting - STXXL:排序期间的并行性有限?

stxxl::VECTOR_GENERATOR<MyData>::result::bufwriter_type我使用需要并行排序的(类似于 100M 条目)填充一个非常大的数组。

我使用该stxxl::sort(vector->begin(), vector->end(), cmp(), memoryAmount)方法,理论上它应该可以满足我的需要:非常有效地对元素进行排序。

但是,在执行此方法期间,我注意到只有一个处理器被充分利用,所有其他内核都非常空闲(我怀疑获取输入的活动很少,但实际上它们什么都不做)。

这是我的问题:是否可以在排序阶段利用更多内核,或者并行性是否仅用于异步获取输入?如果是这样,是否有说明如何启用它的文档?(我广泛查看了网站上的文档,但我找不到任何东西)。

非常感谢!

编辑

谢谢你的建议。我在下面提供了更多信息。

首先,我使用 MacOs 进行实验。我所做的是启动以下程序并研究其行为。

实际上,在这个程序的执行过程中似乎只有一个或最多两个线程在工作。请注意,机器只有一个磁盘。

你能确认一下并行性是否适用于macos吗?如果没有,那么我将尝试使用 linux 看看会发生什么。或者可能是因为只有一个磁盘?

0 投票
0 回答
464 浏览

c++ - STXXL 磁盘分配错误 Windows7

我正在尝试在 Windows 7 - MSVC12 Express 中使用 stxxl。

  1. 如果我不提供配置文件(.stxxl.txt):程序由

    [STXXL-MSG] STXXL v1.4.0 (prerelease/) [STXXL-ERRMSG] 警告:找不到配置文件。[STXXL-ERRMSG] 使用默认磁盘配置。[STXXL-MSG] 磁盘 'C:\Users\Owner\AppData\Local\Temp\stxxl.tmp' 已分配,空间:1000 MiB,I/O 实现:wincall autogrow delete_on_exit queue=0

    但在抛出错误之前经历了很长的周期 -

    “Microsoft C++ 异常:内存位置 0x0028DF50 处的 std::bad_alloc”

  2. 如果我在 'disk=c:/stxxl.tmp,4G,wincall delete' 条目中包含配置文件 (.stxxl.txt):我收到错误

    [STXXL-MSG] STXXL v1.4.0 (prerelease/) [STXXL-MSG] 路径=c:\stxxl.tmp 模式=28 上的 CreateFile() 错误,在没有 DI RECT 模式的情况下重试。[STXXL-MSG] 分配磁盘“c:\stxxl.tmp”时出错,空间:3814 MiB,I/O 实现:wincall delete_on_exit queue=0

  3. 附加信息:

    一个。

    我使用的标头中只有 stxxl 特定信息是:#include

    湾。它没有命中 main - 因为我在第一行放了一个断点。

我试图通过在具有 4 GB 内存的 Windows m/c 上运行来了解这一点。我是新手,你能帮忙吗?

提前致谢。

2014 年 2 月 23 日:下面是 STXXL 的 test_vector 示例中的声明示例(我的导致错误的声明被添加到 STXXL 的 test_vector.cpp 中,效果很好。即使在进入 main 之前,也会产生上述错误。发生这种情况当我在代码中声明“向量 E”时。

0 投票
3 回答
320 浏览

c++ - 为什么存储指向内部内存的普通指针的结构不能存储在 stxxl 容器中?

stxxl常见问题解答中,我发现了这一点:

参数化 STXXL 容器

像 stxxl::vector 这样的 STXXL 容器类型只能使用 POD 的值类型进行参数化(即没有虚拟函数,没有用户定义的复制赋值/析构函数等)并且不包含对内部存储器的引用(包括指针) . 通常,“复杂”数据类型不满足此要求。

这就是为什么stxxl::vector<std::vector<T> >并且 stxxl::vector<stxxl::vector<T> >是无效的。如果合适,使用 std::vector<stxxl::vector<T> >或通过执行索引计算来模拟二维数组。

无法使用stxxl::vector<std::vector<T> >是有道理的,因为stxxl容器不会在容器调整大小时调用所包含元素的构造函数或析构函数。但是如何存储这样的结构:

如果我确实保证a只要stxxl::vector<S>实例存在,所指向的对象就有效,那么将其存储struct到 a中有什么问题stxxl::vector<S>?如果必须将 的特定实例S移动到磁盘,则a指针的值将写入磁盘。稍后,指针值被恢复,我可以使用它。显然,指针值也是机器相关和实例相关的,但即使我处理了指向对象的生命周期,这也是问题吗?我没有通过套接字发送序列化对象,也没有将序列化对象存储在数据库中以供以后使用。

我错过了什么吗?

编辑:有人提醒我stxxl不要复制指针,因此当我稍后检索一个实例时,我可能会得到一个指向垃圾的指针struct S。我知道。我将保证指针在程序的整个生命周期内都是有效的。

0 投票
5 回答
1191 浏览

c++ - 在 C++ 中处理大量数据,需要方法

所以我有一个 CSV 格式的 1GB 文件,我将其转换为 SQLite3 数据库

除了我有 12 列。现在,我需要读取和排序这些数据并重新格式化输出,但是当我尝试这样做时,似乎我的 RAM 用完了(使用向量)。我从 SQLite 中读取它并将文件的每一行存储在一个结构中,然后将其推回双端队列。就像我说的,当 RAM 使用量接近 2gb 时,我的内存用完了,应用程序崩溃了。我尝试使用 STXXL,但显然它不支持非 POD 类型的向量(因此它必须是 long int、double、char 等),并且我的向量主要由 std::string、一些 boost::date 和一个 double 组成价值。

基本上我需要做的是将在特定列中具有相同值的所有“行”组合在一起,换句话说,我需要根据一列对数据进行排序,然后使用它。

关于我如何阅读所有内容或至少对其进行排序的任何方法?我会用 SQLite3 来做,但这似乎很耗时。也许我错了。

谢谢。

0 投票
3 回答
773 浏览

c++ - 如何在 stxxl::map 中使用 std::string 作为键

我正在尝试使用 std::string 作为 stxxl::map 中的键插入对于大约 10-100 的少量字符串来说很好。但是在尝试在其中插入大约 100000 的大量字符串时,我遇到了分段错误。

代码如下:

在这里我无法确定为什么我无法插入更多数量的字符串。我在插入“1377”时正好遇到分段错误。另外,我可以添加任意数量的整数作为键。我觉得字符串的可变大小可能会导致这个问题。

我也无法理解max_value字符串的返回值。我只是返回了一个空白字符串。

0 投票
2 回答
184 浏览

c++ - STXXL 多维向量使程序冻结

尝试处理庞大的数据集时,我一直在使用方便的STXXL库。尽管在尝试使用/生成多维向量时遇到了一个小问题。

以下程序将系统冻结一段时间,然后被杀死。命令行没有输出:

使用调试器单步执行程序,发现冻结发生在以下行:

我正在使用 1.3.1 版的 STXXL,并在 Linux 上使用 GCC 4.8.1 对其进行编译。我不确定我在这里缺少什么。将向量更改为 STD 版本,使其工作。如果简化为 2D 矢量,它也可以工作。

编辑:还尝试了 STXXL 的最新稳定版本(v 1.4.0),但无济于事。出现同样的问题。

0 投票
3 回答
292 浏览

c++ - 如何有效地将大量元素附加到stxxl向量?

我需要将大量元素附加到 stxxl 向量。将元素添加到 stxxl 向量的最有效方法是什么?现在,我正在使用 stxxl 向量的 push_back,但它似乎效率不高。它远未使磁盘带宽饱和。有没有更好的办法?

谢谢,大

0 投票
1 回答
111 浏览

c++ - 如何删除 STXXL 优先级队列?

我在我的程序中创建了一个 STXXL 优先级队列。如果我不再需要PQ,如何删除它?就像 C++ 中的 delete[] 缓冲区一样。我想释放它使用的内存。

我查看了他们的示例和描述,但找不到方法。一旦创建了一个PQ,内存会一直被这个PQ占用到程序结束吗?

例如,如果我定义了两个优先级队列:Q1 和 Q2。

然后我对 Q1 做一些事情,然后删除它,这样我就可以为 Q2 分配更多的内存。

0 投票
1 回答
596 浏览

stxxl - stxxl 对非常大的文件进行排序(ubuntu)

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

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

我的机器有 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 的集群。

代码(受示例/algo/sort_file.cpp 和示例/algo/phonebills.cpp 启发):

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

0 投票
1 回答
220 浏览

c++ - 并行化 STXXL 容器

我正在尝试使用 STXXL 构建一个大型矩阵并能够对矩阵执行几种不同的操作。目前,我正在使用stxxl::vector作为存储我的大矩阵的子矩阵的一种方式。我正在尝试做的是规范化矩阵的每一列。所以我唯一的数据依赖应该在列中。当我尝试使用 openmp 并行化对子矩阵的访问时,我收到错误消息

[STXXL-ERRMSG] 为 BID 提交的 WRITE 请求具有待处理的 READ 请求

一遍又一遍地。我是否误解了 STXXL 的线程安全性?因为我所做的不应该访问同一个子矩阵。这是我尝试调试和运行的示例代码:

我正在运行的 CXX 标志是

-fopenmp -W -Wall -std=c++11 -O3