Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 实现条带化算法C++;_C++_Process_Ifstream - Fatal编程技术网

C++ 实现条带化算法C++;

C++ 实现条带化算法C++;,c++,process,ifstream,C++,Process,Ifstream,嗨,我在实现条带化算法时遇到问题。我在一个向量中加载30000条记录时也遇到了问题,我尝试了这个,但它不起作用 程序应该声明变量以一次存储一条记录。它应该读取一条记录并对其进行处理,然后读取另一条记录,依此类推。每个流程都应该忽略“属于”另一个流程的记录。这可以通过跟踪记录计数并确定是否应处理或忽略当前记录来实现。例如,如果有4个进程(numProcs=4),进程0应该处理记录0、4、8、12。。。(假设我们从0开始计数)并忽略其间的所有其他记录 更新sudo代码 while(!residen

嗨,我在实现条带化算法时遇到问题。我在一个向量中加载30000条记录时也遇到了问题,我尝试了这个,但它不起作用

程序应该声明变量以一次存储一条记录。它应该读取一条记录并对其进行处理,然后读取另一条记录,依此类推。每个流程都应该忽略“属于”另一个流程的记录。这可以通过跟踪记录计数并确定是否应处理或忽略当前记录来实现。例如,如果有4个进程(numProcs=4),进程0应该处理记录0、4、8、12。。。(假设我们从0开始计数)并忽略其间的所有其他记录

更新sudo代码

 while(!residenceFile.eof())
    {
        residenceFile >> res.x >>res.y;


        if ( recCount % numProcs == numLines)
        {
            distancess.push_back(populate_distancesVector(res,foodbankData));
        }
        else
          ++numLines
        ++recCount
    }

对记录0和4起作用的进程仍必须读取记录1、2和3(才能访问4)

另外,
而(!residefile.eof())
不是一种迭代文件的好方法;它将读到结束后一轮。改为执行类似于
while(派驻文件>>res.x>>res.y)
的操作

至于制作一个包含30000条记录的向量,听起来像是内存限制。你确定你一次需要那么多的内存吗

编辑:

仔细查看更新的代码。如果进程ID(
numProcs
)为零,则该进程将对第一条记录执行操作,而不会对其他记录执行操作;如果它是其他东西,它将不会对它们中的任何一个起作用

编辑:

唉,我不懂阿拉伯语。我会尽量用英语解释清楚

在尝试困难的技巧之前,你必须先学习一种简单的技巧。如果你猜猜这个算法,你就会失败

首先,编写一个循环,循环{0,1,2,3,…}并打印出所有数字:

int i=0;
while(i<10)
{
  cout << i << endl;
  ++i;
}
inti=0;

虽然(i您已经用MPI标记了您的帖子,但是我没有看到您在任何地方检查处理器ID以查看它应该处理哪个记录

我认为您所问问题的解决方案的伪代码:

While(there are more records){
If record count % numProcs == myID
   ProcessRecord
else
   Increment file stream pointer forward one record without processing
Increment Record Count
}

如果您事先知道要处理的记录数,那么您可以想出一个更聪明的解决方案,将filestream指针向前移动
numprocs
records,直到达到或超过该记录数。

更新的代码看起来很混乱(也很混乱);是
numProcs
进程的数量,还是进程ID?jsut我想看看更新的逻辑是否正确?您的母语是什么?@Beta我真的尝试过跳转表单和堆栈交换我真的尽力实现用户答案。我真的需要得到的是我想要的正确答案Answers@Beta我写了所有的程序我一个人,但我真的需要这部分来让它正常工作。如果你愿意,我可以发布代码?@ninjaDeveloper:你将只处理更新代码中的
numProcs
记录。请注意我的伪代码中的模运算符
%
。熟悉模数学,这对你作为一名开发人员很有用。感谢伪代码“应该将文件流指针向前移动一条记录而不进行处理。”"有点像线number@ninjaDeveloper:嗯,您需要一种跳过不希望处理的记录的数据的方法。如果您知道它将是2个整数,您可以读入2个整数并将其丢弃。如果您知道它将是某一行,请调用
getline
,然后对读入的字符串不做任何处理到。从外观上看,您已经在阅读
res.x
res.y
,所以这可能是您想要的。@ninjaDeveloper:好的,我会尝试给您代码。首先只需一个问题:您确定知道如何从{0,1,2,3}给每个进程一个进程ID吗?
int i=0;
while(i<10)
{
  cout << i << endl;
  ++i;
}
int i=0;
while(i<10)
{
  if(i%4==0)
    cout << i << endl;
  ++i;
}
While(there are more records){
If record count % numProcs == myID
   ProcessRecord
else
   Increment file stream pointer forward one record without processing
Increment Record Count
}