我正在处理一些二进制数据,这些数据存储在任意长的无符号整数数组中.我发现我有一些重复的数据,我希望在短期内忽略重复,并删除长期导致它们的任何错误.
我正在考虑在存储之前将每个数据集插入到地图中,但只有在地图中找不到它才会开始.我最初的想法是有一个字符串映射,并使用memcpy作为锤子强制整数进入字符数组,然后将其复制到字符串中并存储字符串.这失败了,因为我的大量数据在相关数据的前面包含多个字节0
(又名NULL
),因此大部分非常真实的数据都被抛弃了.
我计划下一次尝试std::map<std::vector<unsigned char>,int>
,但我意识到我不知道地图插入功能是否有效.
这是可行的,即使不明智,还是有更好的方法来解决这个问题?
编辑
所以有人说我没有弄清楚我在做什么,所以这里有一个更好的描述.
我正在努力生成最小生成树,因为我有许多树包含我正在使用的实际端节点.目标是选择具有最短长度并覆盖所有端节点的树,其中所选择的树彼此最多共享一个节点并且全部连接.我的做法是基于二元决策树,但做了一些改进,希望能够实现更大的并行性.
我没有采用二叉树方法,而是为每个数据集选择了无符号整数的位向量,其中位数为1的1表示包含相应的树.
例如,如果只是树0包含在5树数据集中,我就会开始
00001
从这里我可以生成:
00011
00101
01001
10001
然后可以并行处理这些中的每一个,因为它们中没有一个彼此依赖.我这样做对所有的单树(00010,00100,等),并应,我还没有花时间去正式证明这一点,才能够产生范围内的所有值(0.2 ^ N)的一次而且只有一次.
我开始注意到许多数据集的完成时间比我想象的要长得多,并且启用了调试输出以查看所有生成的结果,并且稍后我确认了一个快速的Perl脚本,我有多个进程生成相同的输出.从那以后,我一直在试图解决在重复从非常小的成功来了,我希望这将很好地工作,足以让我验证是否在没有产生结果,有时,第3天等待计算.
我目前正在研究一些图形理论问题的MPI代码,其中许多节点都可以包含答案和答案的长度.为了让所有东西都回到主节点,我正在做一个MPI_Gather来获得答案,并且我正在尝试使用MPI_MINLOC操作来确定谁拥有最短的解决方案.现在我存储长度和节点ID的数据类型定义为(按照http://www.open-mpi.org/doc/v1.4/man3/MPI_Reduce.3.php等众多网站上显示的示例):
struct minType
{
float len;
int index;
};
Run Code Online (Sandbox Code Playgroud)
在每个节点上,我正在以下列方式初始化此结构的本地副本:
int commRank;
MPI_Comm_rank (MPI_COMM_WORLD, &commRank);
minType solutionLen;
solutionLen.len = 1e37;
solutionLen.index = commRank;
Run Code Online (Sandbox Code Playgroud)
在执行结束时,我有一个MPI_Gather调用,成功地将所有解决方案(我从内存中打印出来以验证它们)以及调用:
MPI_Reduce (&solutionLen, &solutionLen, 1, MPI_FLOAT_INT, MPI_MINLOC, 0, MPI_COMM_WORLD);
Run Code Online (Sandbox Code Playgroud)
我的理解是这些论点应该是:
当我的代码进入reduce操作时,我收到此错误:
[compute-2-19.local:9754] *** An error occurred in MPI_Reduce
[compute-2-19.local:9754] *** on communicator MPI_COMM_WORLD
[compute-2-19.local:9754] *** MPI_ERR_ARG: invalid argument of some other kind
[compute-2-19.local:9754] *** MPI_ERRORS_ARE_FATAL (your MPI job will now abort)
--------------------------------------------------------------------------
mpirun has exited due to process …
Run Code Online (Sandbox Code Playgroud)