问题标签 [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.
sorting - STXXL:排序期间的并行性有限?
stxxl::VECTOR_GENERATOR<MyData>::result::bufwriter_type
我使用需要并行排序的(类似于 100M 条目)填充一个非常大的数组。
我使用该stxxl::sort(vector->begin(), vector->end(), cmp(), memoryAmount)
方法,理论上它应该可以满足我的需要:非常有效地对元素进行排序。
但是,在执行此方法期间,我注意到只有一个处理器被充分利用,所有其他内核都非常空闲(我怀疑获取输入的活动很少,但实际上它们什么都不做)。
这是我的问题:是否可以在排序阶段利用更多内核,或者并行性是否仅用于异步获取输入?如果是这样,是否有说明如何启用它的文档?(我广泛查看了网站上的文档,但我找不到任何东西)。
非常感谢!
编辑
谢谢你的建议。我在下面提供了更多信息。
首先,我使用 MacOs 进行实验。我所做的是启动以下程序并研究其行为。
实际上,在这个程序的执行过程中似乎只有一个或最多两个线程在工作。请注意,机器只有一个磁盘。
你能确认一下并行性是否适用于macos吗?如果没有,那么我将尝试使用 linux 看看会发生什么。或者可能是因为只有一个磁盘?
c++ - STXXL 磁盘分配错误 Windows7
我正在尝试在 Windows 7 - MSVC12 Express 中使用 stxxl。
如果我不提供配置文件(.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”
如果我在 '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
附加信息:
一个。
我使用的标头中只有 stxxl 特定信息是:#include
湾。它没有命中 main - 因为我在第一行放了一个断点。
我试图通过在具有 4 GB 内存的 Windows m/c 上运行来了解这一点。我是新手,你能帮忙吗?
提前致谢。
2014 年 2 月 23 日:下面是 STXXL 的 test_vector 示例中的声明示例(我的导致错误的声明被添加到 STXXL 的 test_vector.cpp 中,效果很好。即使在进入 main 之前,也会产生上述错误。发生这种情况当我在代码中声明“向量 E”时。
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
。我知道。我将保证指针在程序的整个生命周期内都是有效的。
c++ - 在 C++ 中处理大量数据,需要方法
所以我有一个 CSV 格式的 1GB 文件,我将其转换为 SQLite3 数据库
除了我有 12 列。现在,我需要读取和排序这些数据并重新格式化输出,但是当我尝试这样做时,似乎我的 RAM 用完了(使用向量)。我从 SQLite 中读取它并将文件的每一行存储在一个结构中,然后将其推回双端队列。就像我说的,当 RAM 使用量接近 2gb 时,我的内存用完了,应用程序崩溃了。我尝试使用 STXXL,但显然它不支持非 POD 类型的向量(因此它必须是 long int、double、char 等),并且我的向量主要由 std::string、一些 boost::date 和一个 double 组成价值。
基本上我需要做的是将在特定列中具有相同值的所有“行”组合在一起,换句话说,我需要根据一列对数据进行排序,然后使用它。
关于我如何阅读所有内容或至少对其进行排序的任何方法?我会用 SQLite3 来做,但这似乎很耗时。也许我错了。
谢谢。
c++ - 如何在 stxxl::map 中使用 std::string 作为键
我正在尝试使用 std::string 作为 stxxl::map 中的键插入对于大约 10-100 的少量字符串来说很好。但是在尝试在其中插入大约 100000 的大量字符串时,我遇到了分段错误。
代码如下:
在这里我无法确定为什么我无法插入更多数量的字符串。我在插入“1377”时正好遇到分段错误。另外,我可以添加任意数量的整数作为键。我觉得字符串的可变大小可能会导致这个问题。
我也无法理解max_value
字符串的返回值。我只是返回了一个空白字符串。
c++ - STXXL 多维向量使程序冻结
尝试处理庞大的数据集时,我一直在使用方便的STXXL库。尽管在尝试使用/生成多维向量时遇到了一个小问题。
以下程序将系统冻结一段时间,然后被杀死。命令行没有输出:
使用调试器单步执行程序,发现冻结发生在以下行:
我正在使用 1.3.1 版的 STXXL,并在 Linux 上使用 GCC 4.8.1 对其进行编译。我不确定我在这里缺少什么。将向量更改为 STD 版本,使其工作。如果简化为 2D 矢量,它也可以工作。
编辑:还尝试了 STXXL 的最新稳定版本(v 1.4.0),但无济于事。出现同样的问题。
c++ - 如何有效地将大量元素附加到stxxl向量?
我需要将大量元素附加到 stxxl 向量。将元素添加到 stxxl 向量的最有效方法是什么?现在,我正在使用 stxxl 向量的 push_back,但它似乎效率不高。它远未使磁盘带宽饱和。有没有更好的办法?
谢谢,大
c++ - 如何删除 STXXL 优先级队列?
我在我的程序中创建了一个 STXXL 优先级队列。如果我不再需要PQ,如何删除它?就像 C++ 中的 delete[] 缓冲区一样。我想释放它使用的内存。
我查看了他们的示例和描述,但找不到方法。一旦创建了一个PQ,内存会一直被这个PQ占用到程序结束吗?
例如,如果我定义了两个优先级队列:Q1 和 Q2。
然后我对 Q1 做一些事情,然后删除它,这样我就可以为 Q2 分配更多的内存。
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 启发):
每个向量元素或记录是四个无符号数字的元组:
c++ - 并行化 STXXL 容器
我正在尝试使用 STXXL 构建一个大型矩阵并能够对矩阵执行几种不同的操作。目前,我正在使用stxxl::vector
作为存储我的大矩阵的子矩阵的一种方式。我正在尝试做的是规范化矩阵的每一列。所以我唯一的数据依赖应该在列中。当我尝试使用 openmp 并行化对子矩阵的访问时,我收到错误消息
[STXXL-ERRMSG] 为 BID 提交的 WRITE 请求具有待处理的 READ 请求
一遍又一遍地。我是否误解了 STXXL 的线程安全性?因为我所做的不应该访问同一个子矩阵。这是我尝试调试和运行的示例代码:
我正在运行的 CXX 标志是
-fopenmp -W -Wall -std=c++11 -O3